HTTPUrlConnection.setContentHandlerFactory()
La méthode throws Exception indiquant que l'usine est déjà définie. Je comprends que. Est-il possible de désactiver l'usine et de changer l'usine de gestion de contenu?comment désactiver la propriété ContentHandlerFactory dans HTTPUrlConnection
Répondre
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.
J'ai essayé votre suggestion, mais elle indique toujours le même défaut d'usine déjà défini. – artsince
@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
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