Найти ClassLoader, загружающий определенный класс - PullRequest
4 голосов
/ 15 марта 2012

Есть ли способ определить, какой ClassLoader загружает определенный класс? Или конкретнее откуда загружается конкретный класс?

У меня есть ситуация, когда загружается старый класс драйвера БД. Я хотел бы найти файл, из которого загружен старый драйвер.

Мой первоначальный подход состоит в том, чтобы установить точку отладки для метода ClassLoader.loadClass (..) и остановить vm после загрузки класса, чтобы увидеть, какой загрузчик классов его загружает. К сожалению, метод loadClass вызывается так часто, что трудно остановиться там, где загружен класс. Я постараюсь установить фильтр точек останова. Однако существует еще одна проблема: из-за архитектуры ClassLoader loadClass вызывается, даже если ClassLoader не отвечает за загрузку.

Должен быть лучший способ достичь того, чего я хочу. У вас есть идея или предложение, где искать решение?

Ответы [ 3 ]

6 голосов
/ 15 марта 2012

Как вы запускаете свою программу?

Добавление следующей опции к местоположению журналов командной строки каждого загружаемого класса.

-verbose:class

Эти журналы обычно появляются в sysout. Но в зависимости от того, как настроено ведение журнала, вам, возможно, придется немного осмотреться.

5 голосов
/ 15 марта 2012
clazz.getProtectionDomain().getCodeSource().getLocation()

Очевидно!(Может NPE.)

(ClassLoader s может загружать классы из нескольких мест.)

0 голосов
/ 22 июня 2013

Также опция -verbose: jni команды java покажет загруженный класс, который НЕ написан на java, т. Е. «Нативный интерфейс java».

-dbednar

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