Подтвердить что ты не робот

GetClass(). getClassLoader() имеет значение null, почему?

У меня есть код, который вызывает...

x = getClass().getClassLoader();

Это возвращает значение null.

Когда я запускаю тот же код не из Eclipse, а в командной строке, он возвращает загрузчик классов.

Я могу взломать код, чтобы сделать это...

if (getClass().getClassLoader() == null)
{
 x = ClassLoader.getSystemClassLoader().getSystemResourceAsStream( loadedPropFileName );
} 

оба скомпилированы и запускаются с одной и той же JVM. (Я уверен, 99,99%).

У кого-нибудь есть идеи, почему первый возвращает null для загрузчика классов?

Edit:

Мой вопрос: "У кого-нибудь есть идеи, почему тот же класс возвращает null при запуске через Eclipse и загрузчик классов при загрузке из командной строки".

Спасибо за совет, что загрузчик Bootstap должен загружать класс в Eclipse. Я не знаю, почему это происходит.

4b9b3361

Ответ 1

Ссылаясь на API doc:

Некоторые реализации могут использовать значение null для представляют загрузчик классов загрузки. Этот метод возвращает null в таком если этот класс был загруженный загрузчиком класса загрузки.

Ответ 2

Вот как это работает. Всякий раз, когда JVM пытается загрузить любой класс, он проверяет ниже условия.

Если класс загружен из Bootstrap ClassPath i.e; jdk\jre\lib\rt.jar, вызывается BootStrap ClassLoader.

Если класс загружен из пути расширения класса расширения i.e; jdk\jre\lib\ext *.jar, вызывается Extension ClassLoader.

Если класс загружен из приложения ClassPath i.e; как указано в переменной среды, вызывается Application ClassLoader.

Так как Bootstrap ClassLoader не реализован в java, он либо реализован в c, либо С++, поэтому нет ссылки на него, поэтому он возвращает null. Но Loader класса Extension и Application написан в java, поэтому вы получите ссылку как [email protected] и [email protected]

Итак, если вы сделаете что-то вроде этого System.out.println(String.class.getClassLoader()) вы получите null, так как этот класс был вызван BootStrap ClassLoader. С другой стороны, если вы делаете то же самое для класса в пути Ext или App Class, вы получите $ ExtClassLoader @someHexValue и [email protected] соответственно.

Ответ 4

Одно можно сказать наверняка: Eclipse имеет более сложную и сложную настройку загрузчика классов, чем при запуске из командной строки. Если вы видите различия в том, как класс classloader появляется в одном и в другом, это довольно вероятная причина.

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

Загрузочный класс ClassLoader статичен после того, как приложение загрузилось, и вы не сможете добавить к нему банки или классы позже, если Eclipse не переопределил реализацию... в этом случае есть еще одно возможное объяснение.

Ответ 5

У меня была такая же проблема. Но решил это, используя: -

<ClassName>.class.getClass().getResource(urlString);

Надеюсь, это поможет другим...

Ответ 6

"Этот метод возвращает null в таких реализациях, если этот класс был загружен загрузчиком класса bootstrap." - JavaDoc в getClassLoader()

Загрузчик нулевого класса зарезервирован для системных классов для целей безопасности и может использоваться только в том случае, если Class.forName(String name, boolean initialize, Loader ClassLoader). Если класс имеет null ClassLoader, большинство проверок безопасности не выполняются.