Вопрос-ответ

Find where java class is loaded from

Найти, откуда загружается класс java

Кто-нибудь знает, как программно выяснить, откуда на самом деле загрузчик классов Java загружает класс?

Я часто работаю над большими проектами, где путь к классу становится очень длинным, и ручной поиск на самом деле невозможен. Недавно у меня была проблема, когда загрузчик классов загружал неправильную версию класса, потому что она находилась в classpath в двух разных местах.

Итак, как я могу заставить загрузчик классов сообщить мне, откуда на диске берется фактический файл класса?

Редактировать: Что насчет того, что загрузчику классов на самом деле не удается загрузить класс из-за несоответствия версии (или чего-то еще), можем ли мы в любом случае выяснить, какой файл он пытается прочитать, прежде чем он его прочитает?

Переведено автоматически
Ответ 1

Вот пример:

package foo;

public class Test
{
public static void main(String[] args)
{
ClassLoader loader = Test.class.getClassLoader();
System.out.println(loader.getResource("foo/Test.class"));
}
}

Это распечатано:

file:/C:/Users/Jon/Test/foo/Test.class
Ответ 2

Другой способ узнать, откуда загружен класс (без манипулирования исходным кодом), - запустить виртуальную машину Java с параметром: -verbose:class

Ответ 3
getClass().getProtectionDomain().getCodeSource().getLocation();
Ответ 4

Это то, что мы используем:

public static String getClassResource(Class<?> klass) {
return klass.getClassLoader().getResource(
klass.getName().replace('.', '/') + ".class").toString();
}

Это будет работать в зависимости от реализации ClassLoader:
getClass().getProtectionDomain().getCodeSource().getLocation()

java