如何在HTTPUrlConnection中取消设置ContentHandlerFactory
问题描述:
HTTPUrlConnection.setContentHandlerFactory()
方法抛出异常说工厂已经定义。我明白那个。是否可以取消设置工厂并更改内容处理工厂?如何在HTTPUrlConnection中取消设置ContentHandlerFactory
答
factory
字段URLConnection
(超类HttpURLConnection
)是一个静态包访问成员变量。它通过API修改的唯一地方是setContentHandlerFactory()
方法,正如您已经注意到的,您只能为应用程序中的任何URL连接(或子类)调用一次。我相信有一种解决方法,但它并不理想:您可以使用反射来重置和/或更改factory
字段的值(假设您的应用程序具有相应的安全管理员权限以制作field accessible)。
这里有一个片段,将这样做:
ContentHandlerFactory newFactory = ... // create factory instance
factoryField = URLConnection.class.getDeclaredField("factory");
factoryField.setAccessible(true);
factoryField.set(null, newFactory);
这样做的问题是,API并不期望这将不会发生,所以有可能是不必要的副作用(因为它适用于所有的网址连接子类)。基本上你会冒这个风险。
我试过你的建议,但它仍然会显示同一工厂已经定义的错误。 – artsince 2010-05-03 06:18:43
@自:我没有任何这样的问题。你应该注意到我上面的代码片段实际上是设置一个新的工厂实例。如果你想“重置”它为null(所以你可以再次调用'setContentHandlerFactory'),你应该这样做:'factoryField.set(null,null);' – Ash 2010-05-03 10:03:34
是的,实际上我已经将该字段设置为null。如果此方法适用于您,我可能会遇到另一个问题... – artsince 2010-05-03 12:53:37