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

Мы знаем, что мы можем переопределить загрузчик System class :

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

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

Как мы получаем файл classа этого «мета» classа loader?

Из 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 для появления двух имен для одной и той же вещи.)

  • Пример Facebook Connect в JSP (tomcat)
  • Попытка создания URL-адресов REST-ful с несколькими точками в части «filename» - Spring 3.0 MVC
  • Удаление Java 8 JDK с Mac
  • Использование открытого ключа из authorized_keys с защитой Java
  • Оператор WITH в Java
  • Уязвимость приложения из-за не случайных hash-функций
  • Является ли ConcurrentHashMap полностью безопасным?
  • Как использовать hibernate с MS Access?
  • Левое дополнение строки с нулями
  • Копия Java ArrayList
  • Gson TypeToken с динамическим типом ArrayList
  • Давайте будем гением компьютера.