Кто-нибудь знает, как программно узнать, откуда на самом деле загрузчик классов Java загружает класс?
Я часто работаю над большими проектами, в которых путь к классам становится очень длинным, а поиск вручную не всегда возможен. У меня недавно была проблема, когда загрузчик классов загружал неверную версию класса, потому что он находился в пути к классам в двух разных местах.
Итак, как я могу заставить загрузчик классов сказать мне, откуда на диске берется фактический файл класса?
Редактировать: А как насчет того, если загрузчик классов действительно не может загрузить класс из-за несоответствия версий (или чего-то еще), есть ли в любом случае, мы могли бы узнать, какой файл он пытается прочитать, прежде чем он читает его?
Ответы:
Вот пример:
Это распечатано:
источник
Test.class.getResource("Test.class")
которая не повторяет имя пакета.Test.class.getResource(Test.class.getSimpleName() + ".class")
BouncyCastleProvider
полного имени пакета требуется однако.getClassLoader()
вернутьсяnull
. Смотрите здесь для расширения этого метода, чтобы справиться с этим.Другой способ выяснить, откуда загружается класс (без манипулирования источником), - запустить Java VM с параметром:
-verbose:class
источник
источник
Это то, что мы используем:
Это будет работать в зависимости от реализации ClassLoader:
getClass().getProtectionDomain().getCodeSource().getLocation()
источник
Версия Джона терпит неудачу, когда объект
ClassLoader
зарегистрирован, посколькуnull
это, кажется, подразумевает, что это было загружено ЗагрузкойClassLoader
.Этот метод решает эту проблему:
источник
Отредактируйте только 1-ю строку:
Main
.classВывод:
Может быть, плохой стиль, но работает отлично!
источник
Как правило, нам не нужно использовать жесткое кодирование. Сначала мы можем получить className, а затем использовать ClassLoader для получения URL-адреса класса.
источник
Посмотрите на этот похожий вопрос. Инструмент для обнаружения того же класса ..
Я думаю, что самое важное препятствие, если у вас есть пользовательский загрузчик классов (загрузка из БД или LDAP)
источник
Простой способ:
Пример выхода:
Или
Пример выхода:
источник
Этот подход работает как для файлов, так и для jar-файлов:
источник
Предполагая, что вы работаете с классом с именем
MyClass
, должно работать следующее:Доступность расположения файла .class на диске зависит от самого загрузчика классов. Например, если вы используете что-то вроде BCEL, определенный класс может даже не иметь представления на диске.
источник