Что загружает загрузчик классов java?
Мы знаем, что мы можем переопределить System classloader с помощью:
java -Djava.system.class.loader=com.test.MyClassLoader xxx
Тогда, поскольку com.test.MyClassLoader
сам по себе является классом, которым он загружен?
Как мы получаем файл класса этого "мета" загрузчика классов?
Ответы
Ответ 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 для появления двух имен для одной и той же вещи. )