2010-04-30 12 views

Répondre

1

Le champ factory dans URLConnection (la superclasse de HttpURLConnection) est une variable membre d'accès au package statique. Le seul endroit où il est modifié via l'API est la méthode setContentHandlerFactory(), et comme vous l'avez noté, vous ne pouvez l'appeler qu'une fois pour toute connexion (ou sous-classe) d'URL dans l'application. Je crois qu'il y a un moyen de contourner cela, mais ce n'est pas idéal: Vous pouvez réinitialiser et/ou modifier la valeur du champ factory en utilisant la réflexion (en supposant que votre application dispose des privilèges appropriés de gestionnaire de sécurité pour créer field accessible).

Voici un extrait qui le fera:

ContentHandlerFactory newFactory = ... // create factory instance 
factoryField = URLConnection.class.getDeclaredField("factory"); 
factoryField.setAccessible(true); 
factoryField.set(null, newFactory); 

Le problème est que l'API ne prévoit pas que cela arrivera jamais, donc il peut y avoir des effets secondaires indésirables (car il applique à toutes les URL sous-classes de connexion). Fondamentalement, vous le feriez à vos risques et périls.

+0

J'ai essayé votre suggestion, mais elle indique toujours le même défaut d'usine déjà défini. – artsince

+0

@artsince: Je n'ai pas ce genre de problème. Vous devriez noter que mon extrait ci-dessus est en train de définir une nouvelle instance d'usine. Si vous voulez le "réinitialiser" à null (donc vous pouvez appeler 'setContentHandlerFactory' à nouveau), vous devriez faire:' factoryField.set (null, null); ' – Ash

+0

oui, en fait j'avais d'abord mis le champ à zéro. Je pourrais avoir un autre problème si cette méthode fonctionne pour vous ... – artsince