Что загружает загрузчик classов java?
Мы знаем, что мы можем переопределить загрузчик System class :
java -Djava.system.class.loader=com.test.MyClassLoader xxx
Тогда, поскольку com.test.MyClassLoader
сам по себе является classом, кем он загружен?
Как мы получаем файл classа этого «мета» classа loader?
- Создавать streamи в java для работы в фоновом режиме
- Преобразование формата даты Java - получение неправильного месяца
- Разделить строку на предложения
- Преобразование любого объекта в массив байтов в java
- Процесс Zombie с использованием 100% CPU
- Эквивалент Sprintf в Java
- Как преобразовать строку JSON в Map с помощью Jackson JSON
- Java 8: Рассчитать разницу между двумя LocalDateTime
- Java: файл CSV Easy Read / Write
- В JDK 1.8 отображается искажение качания, исправлено в JDK 1.7
- Что такое PermSize в Java?
- По умолчанию Xmxsize в Java 8
- Указание порядка для junit 4 тестов на уровне метода (не уровне classа)
Из Javadoc для ClassLoader.getSystemClassLoader
:
Если системное свойство «java.system.class.loader» определено при первом вызове этого метода, значение этого свойства считается именем classа, который будет возвращен в качестве загрузчика системного classа. Класс загружается с использованием загрузчика системного classа по умолчанию и должен определять публичный конструктор, который принимает один параметр типа ClassLoader, который используется в качестве родителя делегирования.
По умолчанию загрузчик системного classа относится к реализации JVM.
Bootstrap classloader
является родителем всех classloaders
и загружает стандартные classы JDK в каталог lib JRE (rt.jar и i18n.jar). Все classы java. * classloader
этим classloader
.
Extensions Classloader
– это непосредственный дочерний Extensions Classloader
загрузчика classов Bootstrap. Этот загрузчик classов загружает classы в каталог lib \ ext JRE.
System-Classpath classloader
– это непосредственный дочерний компонент Extensions classloader. Он загружает classы и банки, заданные переменной среды CLASSPATH
Вы можете попробовать добавить свой пользовательский загрузчик classов с помощью свойства «java.system.class.loader» (см. ClassLoader # getSystemClassLoader ).
Default System class loader
является родителем для экземпляров MyClassLoader,
Tldr:
§ .. значение этого свойства принимается за имя classа, который будет возвращен в качестве загрузчика системного classа. Класс загружается с помощью загрузчика системного classа по умолчанию .
.. Таким образом, если ваш загрузчик classов заменяет X в качестве загрузчика системного classа, то родителем вашего classа будет X, загрузчик системного classа по умолчанию.
(X имеет тип типа sun.misc.Launcher$AppClassLoader
.)
Более подробную информацию можно найти на docs.oracle.com – Как Java Launcher находит classы :
Java launcher, java, инициирует виртуальную машину Java. Виртуальная машина ищет и загружает classы в следующем порядке:
Bootstrap classes – classы, которые include платформу Java, включая classы в rt.jar и несколько других важных файлов jar.
Классы расширения – classы, в которых используется механизм расширения Java. Они поставляются в виде файлов .jar, расположенных в каталоге расширений.
Классы пользователей – classы, определенные разработчиками и третьими лицами, которые не используют механизм расширения. Вы определяете местоположение этих classов с помощью параметра -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
(см. Конфигурацию запуска Eclipse ):
getSystemClassLoader (): MyCL @ 1888759
Classloader of MyCL: [email protected]
..и его тип: class sun.misc.Launcher $ AppClassLoader
Classloader of (Classloader of MyCL): null
Мы видим, что MyCL
загрузчик sun.misc.Launcher$AppClassLoader
– это sun.misc.Launcher$AppClassLoader
, который является загрузчиком sun.misc.Launcher$AppClassLoader
по умолчанию.
(На языке, как показано в другой цитате Oracle выше, системный загрузчик classов по умолчанию также называется загрузчиком classов « User Classes ». Отверните Oracle для появления двух имен для одной и той же вещи.)