как сбросить ContentHandlerFactory в HTTPUrlConnection - PullRequest
1 голос
/ 30 апреля 2010

HTTPUrlConnection.setContentHandlerFactory() метод выдает исключение, говоря, что фабрика уже определена. Я это понимаю. Можно ли сбросить фабрику и изменить фабрику обработчика содержимого?

1 Ответ

1 голос
/ 30 апреля 2010

Поле factory в URLConnection (суперкласс HttpURLConnection) является статической переменной-членом доступа к пакету. Единственное место, где он изменяется с помощью API, - это метод setContentHandlerFactory(), и, как вы заметили, вы можете вызывать его только один раз для любого URL-соединения (или подкласса) в приложении.

Я считаю, что есть способ обойти это, но вряд ли он идеален: вы можете сбросить и / или изменить значение поля factory, используя отражение (при условии, что ваше приложение имеет соответствующие привилегии администратора безопасности, чтобы создать поле доступны ).

Вот фрагмент кода, который сделает это:

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

Проблема в том, что API не ожидает, что это когда-либо произойдет, поэтому могут возникнуть нежелательные побочные эффекты (так как это относится ко всем подклассам URL-соединения). По сути, вы будете делать это на свой страх и риск.

...