Стандартные классы JDK и «нулевой» ClassLoader? - PullRequest
8 голосов
/ 09 декабря 2011

Привет, ребята: я пытаюсь отладить очень странную ошибку класса, посмотрев на ClassLoader s для некоторых динамически создаваемых компонентов.ClassLoader s - это то, с чем я никогда не играл много - и я удивлен, что стандартные классы JDK имеют ноль экземпляры загрузчика классов.

Может кто-нибудь объяснить выход этого простого методаусловия классов, загрузчики которых я пытаюсь напечатать, а также в более общем плане -

  1. способ работы ClassLoader s на JVM и
  2. как мы можем отлаживать отсутствующие классы, используяClassLoader с.
public class MyClass {

    /**
     * @param args
     */
    public static void main(String[] args) {

        System.out.println(relfect.MyClass.class.getClassLoader());
        System.out.println(String.class.getClassLoader());
        System.out.println(ArrayList.class.getClassLoader());
        System.out.println(JButton.class.getClassLoader());
        System.out.println(System.class.getClassLoader());

        Boolean b = new Boolean(true);
        System.out.println(b.getClass().getClassLoader());

    }

}

Выход

sun.misc.Launcher$AppClassLoader@1f7182c1
null
null
null
null
null

Ответы [ 3 ]

19 голосов
/ 09 декабря 2011

Javadoc для getClassLoader() говорит

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

Итак, это, по крайней мере, объясняет, почему вы получаете этот результат.Но это не объясняет, почему разработчики решили сделать это таким образом.

РЕДАКТИРОВАТЬ: После тестирования добавления моих собственных классов в путь bootclasspath они также отображаются как загрузчик нулевых классов.

2 голосов
/ 10 декабря 2011

Загрузчик классов загрузочных классов равен нулю, это не Java-класс.

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

Классы в classpath загружаются загрузчиком классов System, и его класс можно указать через свойство.

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

1 голос
/ 26 сентября 2015

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

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

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

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

Поскольку Bootstrap ClassLoader не реализован в java, он либо реализован в c или c ++, поэтому нет ссылки на него, поэтому он возвращает ноль.Но класс Loader для расширений и приложений написан на Java, поэтому вы получите ссылку как sun.misc.Launcher$ExtClassLoader@someHexValue и sun.misc.Launcher$AppClassLoader@someHexValue.

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

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