Зачем использовать загрузчик класса?
На языке Java загрузка класса завершается во время программы. Хотя эта стратегия будет немного увеличить накладные расходы при загрузке класса, она предоставит Java -приложения с высокой степенью гибкости. Например:
1. Напишите приложение, ориентированное на интерфейс и может подождать, пока оно не запустится, прежде чем указать подкласс реализации;
2. Пользователи могут настроить загрузчик класса, позволяя программе загружать двоичный поток из сети или других мест в рамках кода программы во время выполнения; (Это основа для подключаемого модуля Android, динамической установки и обновления APK)
Зачем изучать весь процесс загрузки класса?
Механизм загрузки класса
JVM загружает файл класса в память и проверяет, анализирует и инициализирует данные и, наконец, формирует весь процесс типа Java, который JVM может напрямую использовать.
нагрузка
Загрузите содержимое Bytecode в файле класса в память и преобразуйте статические данные в структуру данных среды выполнения в области метода, и генерируйте объект java.lang.Class , представляющий этот класс в куче, в качестве портала доступа для данных класса области метода. Этот процесс требует участия классового погрузчика.
Связь
Процесс объединения бинарного кода класса Java в состояние JVM -работа
инициализация
<clinit>() . Метод Class Constructor <clinit>() генерируется компилятором, автоматически собирающим действия присвоения всех переменных класса в классе и слияние операторов в блоке статического оператора (статический блок).<clinit>() правильно заблокирован и синхронизирован в многопоточной среде.Пример 1:
открытый класс demo01 {public static void main (string [] args) {a a = new a (); System.out.println (A.Width); }} класс A {public static int width = 100; // Статическая переменная, статическое поле поля static {System.out.println ("Статическая инициализация класса A"); ширина = 300; } public a () {System.out.println ("Создать объект класса A"); }}проанализировать:
иллюстрировать:
Существуют стеки, кучи (местные объекты) и области методов в памяти (на самом деле специальная куча)
1. Когда JVM загружает Demo01, сначала образуйте статические данные (переменные класса, методы класса, код ...) в области метода. В то же время в куче будет образован объект java.lang.Class (отражающий объект), представляющий класс Demo01. Через объект можно получить доступ к двойной структуре класса. Затем загрузите информацию класса A, а также сформируйте объект A в кучу, представляя класс A.
2. Когда выполняется основной метод, в стеке будет сформирован основной кадр стека методов, а один метод соответствует кадре стека. Если основной метод вызывает другие методы, он будет нажать его один за другим в стеке. В основном методе есть локальная переменная. В начале значение А является нулевым. Конструктор класса A вызывается через новый. Метод a () генерируется в стеке, а объект генерируется в куче. Затем адрес объекта выплачивается в стек. В настоящее время A имеет адрес объекта.
3. Когда называется A.Width, вызываются данные о области метода.
Когда класс загружен ссылкой, класс будет загружен только один раз
Активная ссылка на класс (инициализация класса определенно будет происходить)
java.lang.reflect , чтобы сделать вызовы отражения в классе Пассивная ссылка на класс (инициализация класса не произойдет)
Пример 2:
открытый класс Demo01 {static {System.out.println ("Статическая инициализация Demo01"); } public static void main (string [] args) бросает исключение {System.out.println ("Главный метод Demo01!"); System.out.println (System.getProperty ("java.class.path")); // активная ссылка // new a (); // system.out.println (a.width); // class.forname ("com.sinosoft.test.a"); // пассивная ссылка // system.out.println (a.max); // a [] as = new a [10]; System.out.println (b.width); // класс B не будет загружен}} класс B расширяет {static {System.out.println ("Статическая инициализация B"); }} класс A расширяет a_father {public static int width = 100; // Статическая переменная, статическое полевое поле Общедоступное статическое окончательное окончательное значение int max = 100; static {System.out.println ("Статическая инициализация класса A"); ширина = 300; } public a () {System.out.println ("Создать объект класса A"); }} класс A_Father Extends Object {static {System.out.println ("Статическая инициализация A_FATHER"); }}Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.