Класс погрузчик
Загрузчик Java Class должен динамически загружать требуемые классы в JVM во время выполнения. Загрузчик класса Java основан на трех механизмах: делегат, видимый и одинокий.
Загрузите файлы .class под панцирем в память и обработайте их в Bytecode. Эти задачи выполняются классовым загрузчиком.
По умолчанию класс загрузчик
Система по умолчанию по умолчанию на три классных погрузчика:
Загрузчик класса также является классом Java, но Bootstrap - нет. Проверочный код:
public class classloadertest {public static void main (string [] args) {System.out.println (System.class.getClassLoader ()); }}Вывод: NULL
If System.out.println (System.class.getClassLoader (). ToString); используется, сообщается об исключении с нулевым указателем:
Exception in thread "main" java.lang.NullPointerException at com.iot.classloader.ClassLoaderTest.main(ClassLoaderTest.java:10) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) на sun.reflect.delegatingmethodaccessorimpl.invoke (делегирующий methodaccessorimpl.java:43) на java.lang.reflect.method.invoke (метод.java:483) на com.intellij.rt.execution.application.appmain.main (appmain.java.14.
Как видно, системный класс загружается загрузчиком класса начальной загрузки.
Механизм делегата класса погрузчика
Деревящая диаграмма классовой погрузки
Класс погрузчик
Общий порядок загрузки классов:
Как написать пользовательский загрузчик класса
API:
Класс класса загрузчика
Шаблон метода проектирования
Родительский класс:
CloadClass (процесс загрузки класса, шаблон)
Класс FindClass Логика загрузки для переопределения подкласса вызвано методом LoadClass.
DecianceClass Получить файл класса, преобразованный в ByteCode
Подкласс: переопределить метод поиска
пример:
Исходный код метода нагрузки
Защищенный класс <?> LoadClass (String name, Boolean Resolve) Throws classNotFoundException {Synchronized (getClassLoadingLock (name)) {// сначала проверяйте, был ли класс уже загружен класс <?> c = findloadedClass (name); if (c == null) {long t0 = System.nanotime (); попробуйте {if (parent! = null) {c = parent.loadclass (имя, false); } else {c = findbootStrapClassornull (name); }} catch (classnotfoundexception e) {// classnotfoundexception брошен, если класс не найден // из не нулевого загрузчика класса} if (c == null) {// Если все еще не найдено, то вызовите FindClass в порядке // найти класс. long t1 = System.nanotime (); c = findClass (имя); // это определяющий загрузчик класса; Запишите STATS Sun.misc.perfcounter.getParentDelegationTime (). addTime (T1 - T0); sun.misc.perfcounter.getFindClasStime (). AddElapsedTimefrom (T1); sun.misc.perfcounter.getFindClasses (). IGRMET (); }} if (Resolve) {ResolVeclass (c); } return c; }}Примеры в документации API:
Class NetworkClassLoader Extends ClassLoader {String Host; int порт; открытый класс findclass (string name) {byte [] b = LoadClassData (name); вернуть Decianclass (имя, B, 0, B.Length); } private Byte [] LoadClassData (String name) {// Загрузить данные класса из подключения. Полем Полем }}