Что загружает загрузчик 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 для появления двух имен для одной и той же вещи.)

  • Аннотирование функционального интерфейса выражения Lambda
  • Как преобразовать XML в java.util.Map и наоборот
  • Защищенный модификатор доступа в Java
  • Кэширование ответа HTTP
  • Обратный компаратор в Java 8
  • Есть ли рекомендуемый способ использования шаблона Observer в MVP с использованием GWT?
  • Получить атрибут annotations Java
  • Java: разные двойные и двойные в сравнении
  • int array (сортировка от самого низкого до самого высокого)
  • Создание интерфейса Java с помощью SWIG
  • Обработка сигналов с использованием «TERM»
  • Interesting Posts

    Можно использовать AutoMapper для отображения одного объекта в список объектов?

    Как удалить US Keyboard из списка языков Windows 10

    Как конвертировать R Markdown в PDF?

    Как сохранить свечу DataFrame как csv на диске?

    annotations, чтобы сделать приватный метод общедоступным только для тестовых classов

    Ограничить использование пасты в выпадающих ячейках в excel

    Как отделить начальную нагрузку от инкрементальных детей с Firebase?

    Сортировка поля varchar численно в MySQL

    Есть ли способ создать кортеж из списка (без кодирования)?

    Как отправить данные для всей таблицы с помощью jQuery DataTables

    Могу ли я запустить 3 монитора с бортовой плюс дискретной графической картой?

    Java-эквивалент шифрования OpenSSL AES CBC

    Объединение двух изображений в C # /. NET

    Как написать запрос LDAP для проверки, является ли пользователь членом группы?

    Objective-C разметка шестнадцатеричной строки для целого числа

    Давайте будем гением компьютера.