2009-12-17 2 views
32

У меня есть некоторый код, который вызывает ..getClass(). GetClassLoader() имеет значение null, почему?

x = getClass().getClassLoader(); 

Это возвращает нуль, хотя.

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

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

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

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

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

Edit:

Мой вопрос имеет «Кто-нибудь есть какие-либо идеи, почему же класс будет возвращать нуль при запуске через Eclipse, и загрузчика классов при загрузке из командной строки»

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

ответ

30

Цитируя API doc:

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

+3

Правда, но если реализация такая же, почему различное поведение в командной строке и Eclipse. Я думаю, что это то, что ОП действительно спрашивает ... –

+1

Если он хочет знать что-то другое, чем то, о чем он просит, почему он не спрашивает, что он действительно хочет знать? – Bombe

3

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

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

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

0

У меня была та же проблема. Но решить ее с помощью: -

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

Надеется, что это помогает другим ...

7

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

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

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

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

Поскольку Bootstrap ClassLoader не реализован в Java, он либо реализован в c, либо 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] соответственно.

0

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

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