2010-04-30 187 views

回答

1

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并不期望这将不会发生,所以有可能是不必要的副作用(因为它适用于所有的网址连接子类)。基本上你会冒这个风险。

+0

我试过你的建议,但它仍然会显示同一工厂已经定义的错误。 – artsince 2010-05-03 06:18:43

+0

@自:我没有任何这样的问题。你应该注意到我上面的代码片段实际上是设置一个新的工厂实例。如果你想“重置”它为null(所以你可以再次调用'setContentHandlerFactory'),你应该这样做:'factoryField.set(null,null);' – Ash 2010-05-03 10:03:34

+0

是的,实际上我已经将该字段设置为null。如果此方法适用于您,我可能会遇到另一个问题... – artsince 2010-05-03 12:53:37