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

Что загружает загрузчик классов java?

Мы знаем, что мы можем переопределить System classloader с помощью:

java -Djava.system.class.loader=com.test.MyClassLoader xxx

Тогда, поскольку com.test.MyClassLoader сам по себе является классом, которым он загружен?

Как мы получаем файл класса этого "мета" загрузчика классов?

4b9b3361

Ответ 1

Из Javadoc для ClassLoader.getSystemClassLoader:

Если системное свойство "java.system.class.loader" определено при первом вызове этого метода, значение этого свойства считается именем класса, который будет возвращен в качестве загрузчика системного класса. Класс загружается с использованием загрузчика системного класса по умолчанию и должен определять публичный конструктор, который принимает один параметр типа ClassLoader, который используется в качестве родителя делегирования.

По умолчанию загрузчик системного класса специфичен для реализации JVM.

Ответ 2

Bootstrap classloader является родительским элементом для всех classloaders и загружает стандартные классы JDK в каталог lib JRE (rt.jar и i18n.jar). Все классы java. * Загружаются этим classloader.

Extensions Classloader является непосредственным потомком загрузчика классов Bootstrap. Этот загрузчик классов загружает классы в каталог lib\ext JRE.

System-Classpath classloader - это непосредственный дочерний компонент класса Extensions classloader. Он загружает классы и банки, указанные переменной среды CLASSPATH

Вы можете попробовать ввести свой пользовательский загрузчик классов с помощью свойства "java.system.class.loader" (см. ClassLoader # getSystemClassLoader).

Default System class loader является родительским для экземпляров MyClassLoader,

Ответ 3

TL;DR:

& sect;. Значение этого свойства считается именем класса, который будет возвращен в качестве загрузчика системного класса, Класс загружается с помощью загрузчика системного класса по умолчанию..

. Таким образом, если ваш загрузчик классов заменяет X в качестве загрузчика системного класса, то ваш родитель-загрузчик будет X, загрузчиком системного класса по умолчанию.

(X имеет тип типа sun.misc.Launcher$AppClassLoader.)

Дополнительную информацию можно найти на docs.oracle.com - Как Java Launcher находит классы:

Java-пуск, java, инициирует виртуальную машину Java. виртуальная машина ищет и загружает классы в следующем порядке:

классы Bootstrap. Классы, которые включают платформу Java, включая классы в rt.jar и несколько других важных файлов jar.

Классы расширения. Классы, в которых используется механизм расширения Java. Они связаны как .jar файлы, расположенные в каталоге расширений.

Классы пользователей. Классы, определенные разработчиками и третьими лицами, которые не используют механизм расширения. Вы идентифицируете расположение этих классов с использованием опции -classpath на командной строки с помощью переменной среды CLASSPATH.

Tsmr:

Мы можем доказать, что X действительно является родителем нашего Classloader:

/** run with -Djava.system.class.loader=MyCL to use this classloader */
public class MyCL extends ClassLoader {
    public MyCL(ClassLoader parent) { // this constructor must be public, else IllegalAccessException
        super(parent);
    }
}

Это наш основной код:

public class Main {
    public static void main(String args[]) {
        System.out.println("getSystemClassLoader(): " + ClassLoader.getSystemClassLoader());

        ClassLoader cl = MyCL.class.getClassLoader();
        System.out.println("Classloader of MyCL: " + cl);

        Class type_of_cl = cl.getClass();
        System.out.println("..and its type: " + type_of_cl);

        ClassLoader cl_of_cl = class_of_cl.getClassLoader();
        System.out.println("Classloader of (Classloader of MyCL): " + cl_of_cl);
    }
}

Это результат (в моей системе) при запуске с помощью команды java -Djava.system.class.loader=MyCL Main (cf. Eclipse run config):

getSystemClassLoader(): MyCL @1888759
Классный загрузчик MyCL: [email protected]
..и его тип: класс sun.misc.Launcher $AppClassLoader
Classloader of (Classloader of MyCL): null

Мы видим, что MyCL classloader sun.misc.Launcher$AppClassLoader, который является загрузчиком системного класса по умолчанию.

(На языке, как показано в предыдущей цитате Oracle, системный загрузчик классов по умолчанию также называется загрузчиком классов " User Classes". Вверните Oracle для появления двух имен для одной и той же вещи. )