Рефлексия и конфигурация
Работайте с динамическими возможностями
«Рефлексия и конфигурация» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Рефлексия и конфигурация
Анализ замкнутого мира средства создания нативного образа видит только код, который может проследить статически. Динамические возможности — рефлексия, прокси, ресурсы и сериализация — скрывают свои цели от анализатора. В этом уроке объясняется, как заставить их работать в нативном двоичном файле.
Проблема с рефлексией
Когда Вы получаете класс по имени из строки, анализатор не может понять, какой именно класс имеется в виду. Если этот класс недостижим иным способом, он будет исключён из образа, и получение завершится ошибкой во время выполнения.
public class Main {
public static void main(String[] args) throws Exception {
String name = "java.util.ArrayList"; // could come from config
Class<?> c = Class.forName(name);
System.out.println("Loaded: " + c.getSimpleName());
}
}Метаданные достижимости
Решение — метаданные достижимости: файлы JSON, сообщающие средству создания нативного образа, какие классы, методы и поля используются динамически. После этого сборка сохраняет их и записывает сведения об их членах.
Конфигурационный файл рефлексии
Запись для рефлексии указывает класс и члены, которые нужно сохранить. Этот фрагмент написан в JSON, а не на Java; он находится в META-INF/native-image/.
[
{
"name": "com.example.Person",
"allDeclaredConstructors": true,
"allDeclaredMethods": true,
"fields": [ { "name": "age" } ]
}
]Агент трассировки
Составлять метаданные вручную утомительно. Запустите приложение на JVM с агентом трассировки (-agentlib:native-image-agent=config-output-dir=...). Он фиксирует каждый динамический доступ во время настоящего запуска и автоматически создаёт файлы конфигурации.
Проверьте все пути выполнения кода
Агент фиксирует только то, что действительно выполняется, поэтому Вы должны провести приложение через все его возможности — запустите под ним свои тесты. Любой пропущенный путь рефлексии будет отсутствовать в метаданных и приведёт к сбою нативной сборки.
Динамические прокси
Динамическим прокси JDK нужен файл proxy-config.json со списком наборов интерфейсов, для которых создаются прокси. Анализатор не может вывести их самостоятельно, поскольку список интерфейсов формируется во время выполнения.
Ресурсы
Файлы, загружаемые через getResourceAsStream, не встраиваются автоматически. Файл resource-config.json с шаблонами glob сообщает средству создания нативного образа, какие ресурсы нужно включить в исполняемый файл.
public class Main {
public static void main(String[] args) {
var url = Main.class.getResource("/banner.txt");
System.out.println("Resource present: " + (url != null));
}
}Сериализация и JNI
Сериализация Java и нативные вызовы (JNI) также являются динамическими. Для каждого из них есть собственный конфигурационный файл (serialization-config.json, jni-config.json). Агент трассировки тоже создаёт их, когда соответствующие пути выполняются.
Регистрация программным способом
Авторы библиотек могут регистрировать метаданные в коде с помощью Feature через API RuntimeReflection, выполняемый во время сборки. Так библиотека поставляет корректную конфигурацию внутри себя, и пользователям не требуется настраивать её вручную.
Общий репозиторий метаданных
GraalVM поддерживает общий репозиторий метаданных достижимости с готовой конфигурацией для популярных библиотек. Инструменты сборки нативных образов могут загружать её автоматически, поэтому распространённые фреймворки работают без дополнительной настройки.
Быстрая проверка
Проверьте своё понимание динамических возможностей в нативном образе.
Итоги
Вы научились работать с динамическими возможностями:
- Рефлексия, прокси, ресурсы, сериализация и JNI невидимы для статического анализа.
- Файлы JSON с метаданными достижимости объявляют их для средства создания нативного образа.
- Агент трассировки автоматически создаёт конфигурацию по результатам настоящего запуска JVM.
- Проверяйте все пути выполнения кода, особенно тесты, чтобы ничего не пропустить.
- Используйте общий репозиторий метаданных для популярных библиотек.
Часто задаваемые вопросы
Урок «Рефлексия и конфигурация» бесплатный?
Да — полный текст урока «Рефлексия и конфигурация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Рефлексия и конфигурация»?
Работайте с динамическими возможностями Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Рефлексия и конфигурация»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое GraalVM
- Создание нативного образа
- Рефлексия и конфигурация
- Компромиссы нативного образа