Как я могу отслеживать открытые URL через класс java.net.URL в программе на Java? - PullRequest
3 голосов
/ 05 февраля 2010

Я работаю над большим (много классов) Java-проектом, и у меня есть его исходный код, но большинство классов динамически создаются или загружаются через ClassLoaders. В любом случае, я хотел бы иметь возможность "переопределить" класс java.net.URL, чтобы я мог отследить вызовы, чтобы открыть URL. Я не могу использовать сниффер, потому что контент зашифрован SSL. Я пытался расширить java.net.URL, но это не сработало, потому что это последний класс. Я также открыл исходный код для java.net.URL и изменил его и смог успешно его собрать. Теперь, как я могу сделать загрузчик классов по умолчанию для java, чтобы загрузить мою измененную копию java.net.URL вместо оригинальной? Любые предложения приветствуются! Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 05 февраля 2010

Можно использовать AspectJ и встраивать свой код расширения в класс URL вместо его расширения. Таким образом, вам не нужно изменять какие-либо исходные коды, и вы все равно можете «расширять» конечный класс. Недостатком, конечно, является то, что вы добавляете в свой проект еще одну зависимость.

Если вы еще не работали с AOP, вы можете найти краткое введение в AOP в моем блоге: http://whatiscomingtomyhead.wordpress.com/2010/02/06/aspect-oriented-programming-an-introduction/

2 голосов
/ 05 февраля 2010

Вы не можете расширить URL, как обнаружили. Вы можете быть в состоянии заставить JVM загрузить вашу пользовательскую версию класса, но ИМХО, это звучит как кошмар.

К счастью, вы можете реализовать пользовательский URLStreamHandlerFactory и зарегистрировать его с помощью URL.setURLStreamHandlerFactory (). Это позволит вам переносить и отслеживать, когда URL открывают потоки, так, как вы хотите.

EDIT

Но вы не сможете использовать этот подход, если ваше приложение уже зарегистрировало его; URLStreamHandlerFactories - это 1 / приложение. И многие типы контейнеров приложений используют один (например, Tomcat), поэтому, если вы используете один из них, вы SOL.

1 голос
/ 05 февраля 2010

Рассматривали ли вы использование AspectJ? Вы можете установить pointcut для конструкторов URL и, таким образом, получать уведомления о создании любого нового экземпляра URL.

0 голосов
/ 05 февраля 2010

Если вы изменили классы в стандартном API, вы должны добавить путь к классу загрузки с вашими классами (jar или каталогами), в противном случае внутренние классы виртуальной машины будут иметь приоритет над любыми классами, добавленными к обычному пути к классам. В случае виртуальной машины Sun вы можете использовать аргумент -Xbootclasspath / p: для добавления новых классов с более высоким приоритетом, чем внутренние реализации.

Другой вариант, без изменения реализации URL, может заключаться в реализации ProxySelector. Открытие URLConnection приведет к тому, что реализация URL запросит ProxySelector.select (URI uri) для поиска подходящего прокси для данного адреса. Это даже будет работать, если вы на самом деле используете прокси. Вы можете получить системный ProxySelector с помощью ProxySelector.getDefault (), прежде чем зарегистрировать свою собственную реализацию и делегировать вызовы выбора исходной реализации после отслеживания URI, который передается методу выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...