1 Какова концепция механизма загрузки классов?
JVM загружает данные, описывающие класс, из файла Class в память, проверяет, преобразует, анализирует и инициализирует данные и, наконец, формирует тип Java, который может быть непосредственно использован виртуальной машиной. Это механизм загрузки классов.
Каковы компоненты байт-кода типа 2?
В структуре файла класса есть только два типа данных:
- беззнаковое число: это базовый тип данных, где u1, u2, u4 и u8 представляют беззнаковые числа размером 1, 2, 4 и 8 байт соответственно, которые можно использовать для описания чисел, ссылок на индексы, количественных значений или кодирования в соответствии с в UTF-8 строковое значение ;
- поверхность: составной тип данных, состоящий из нескольких чисел без знака или других таблиц в качестве элементов данных, все таблицы заканчиваются на «_info»;
- Таким образом, файл класса по сути представляет собой таблицу;
Содержимое файловой структуры класса состоит из:
- магическое число: Первые 4 байта каждого файла класса, магический номер языка JAVA: CAFEBABE, шестнадцатеричное число, только слева и справа, чтобы подтвердить, является ли файл файлом класса, принятым виртуальной машиной;
- Версия файла класса: 5-й и 6-й байты файла Class являются дополнительным номером версии, а 7-й и 8-й байты — основным номером версии;
- постоянный пул: Начиная с 9-го байта, он в основном хранит два типа констант: (1) литералы, (2) символические ссылки;
- Флаг доступа: два байта сразу после пула констант представляют собой флаг доступа, представляющий иерархическую информацию о классе или интерфейсе;
- Индекс класса, индекс родительского класса и коллекция индексов интерфейса: За индексом класса, индексом родительского класса и индексом интерфейса следует флаг доступа, все из которых являются данными типа u2, и отношение наследования класса определяется этими тремя данными в файле класса;
- Коллекция полевых таблиц: за ним следует коллекция таблиц полей, которая используется для описания переменных, объявленных в интерфейсе или классе;
- Коллекция таблиц методов: Далее идет коллекция таблиц методов, которая используется для описания методов, объявленных в интерфейсе или классе;
3 Процесс загрузки класса примерно разделен на несколько этапов?
4 Когда начнется загрузка класса?
- Создайте экземпляр класса: создать экземпляр объекта с помощью нового ключевого слова;
- Доступ к статическим переменным класса: GetStatic или Putstatic, читайте или установите статическую переменную класса (исключая статические переменные, модифицированные финалом);
- Доступ к статическим методам класса: invokestatic вызывает статический метод класса;
- Использование java.lang.reflect для вызовов отражения: Например, Class.forName("xxxxx");
- Когда подкласс инициализируется, родительский класс будет инициализирован первым;
5 У вас есть несколько пассивных ссылок, пассивные ссылки не запускают инициализацию?
- Ссылка на статические поля родительского класса через подкласс не приведет к инициализации подкласса, будет инициализирован только родительский класс;
- Ссылка на класс через определение массива не вызывает инициализацию класса;
- Константы будут храниться в пуле констант вызывающего класса на этапе компиляции, и нет прямой ссылки на класс, определяющий константу по сути, потому что инициализация класса, определяющего константу, не будет инициирована;
6 Загрузка класса: Каков конкретный процесс первого этапа загрузки?
- Получите двоичный поток, определяющий этот класс по его полному имени;
- Преобразование статической структуры двоичного потока в структуру данных времени выполнения области метода;
- Генерирует объект java.lang.class, представляющий этот класс в памяти. Для виртуальной машины HotSpot объект класса хранится в области метода;
7 Загрузка класса: каков конкретный процесс второго этапа проверки?
Основная функция заключается в обеспечении того, чтобы информация, содержащаяся в потоке байтов файла Class, соответствовала требованиям текущей виртуальной машины и не угрожала безопасности самой виртуальной машины;
- проверка формата файла: проверьте формат и версию;
- проверка метаданных: семантический анализ байт-кода;
- Проверка байт-кода;
- Проверка символьной ссылки;
8 Загрузка класса: Каков конкретный процесс этапа подготовки к третьему шагу?
- Формально выделяют память для переменных класса, и память выделяется в области методов.Переменные класса относятся к статически измененным переменным;
- Установите начальное значение переменной класса.Это начальное значение обычно является нулевым значением типа данных, например: public static int value = 123, начальное значение 0, а не 123, и присваивание 123 не будет выполняться до этапа инициализации;
9 Загрузка класса: каков конкретный процесс четвертого шага фазы синтаксического анализа?
Заменить символические ссылки в константном пуле файла класса прямыми ссылками;
10 Загрузка класса: пятый шаг для инициализации конкретного процесса?
Чтобы фактически начать выполнение программного кода Java, определенного в классе, процесс инициализации представляет собой процесс выполнения метода конструктора класса ();
- Метод () будет автоматически собирать действия присваивания и статические блоки кода всех переменных класса (статических) в классе, а порядок сбора компилятором определяется порядком появления кода;
- Метод () отличается от конструктора экземпляра класса.Виртуальная машина гарантирует, что метод () родительского класса будет выполнен до выполнения метода () подкласса;
12 Существует несколько типов загрузчиков классов, и какова роль каждого из них?
- Загрузчик корневого класса (Bootstrap ClassLoader): отвечает за загрузку основных классов Java, таких как String и System;
- Расширение ClassLoader: отвечает за загрузку расширенной библиотеки классов JRE;
- Системный загрузчик классов: отвечает за загрузку пакета JAR и пути к классам, заданного переменной среды CLASSPATH;
- Загрузчик пользовательских классов: определяемый пользователем загрузчик с загрузчиком классов в качестве родительского класса.
13 Что такое шаблон делегирования родительского загрузчика классов и почему?
Механизм родительского делегирования: если загрузчик класса получает запрос на загрузку класса, он не будет пытаться сначала загрузить класс сам по себе, а делегирует задачу запроса загрузчику родительского класса для рекурсивного завершения, если родительский класс Если загрузчик может завершить задачу загрузки класса, он вернется успешно; только когда загрузчик родительского класса не может завершить задачу загрузки, он загрузит ее сам.
Классы Java имеют приоритетную иерархию вместе с загрузчиком классов, который их загружает. Например, класс Object в Java хранится в rt.jar. Независимо от того, какой загрузчик классов хочет загрузить этот класс, в конечном итоге он делегируется для загрузки загрузчику запускаемого класса в верхней части модели. Поэтому Object загружается в различные Тот же класс в среде загрузки классов. Если родительская модель делегирования не принята, то каждый загрузчик классов будет загружаться и загружаться сам по себе, тогда в системе будет много разных классов объектов.