Отражение в Java: получение имени и типа параметров метода
Быстрый ответ
Чтобы определить имена параметров метода в Java Reflection, класс должен быть скомпилирован с ключом -parameters
. Для доступа к именам применяется API java.lang.reflect.Parameter
:
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
// Определение метода
Method method = YourClass.class.getMethod("yourMethod", String.class);
// Перебор и вывод имен параметров
for (Parameter param : method.getParameters()) {
System.out.println(param.getName());
}
Памятка: при компиляции обязательно используйте ключ -parameters
. В противном случае вместо реальных имен параметров будет выводиться arg0
, arg1
и так далее.
Сохранение имен параметров при компиляции
Без специального флага в байт-код классов Java не включаются имена параметров. Чтобы их сохранить, используйте опцию -parameters
при компиляции.
Компиляция при помощи JDK
javac -parameters YourClass.java
Компиляция с Maven
Добавьте ключ -parameters
в настройки плагина maven-compiler-plugin
в файле pom.xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
Использование параметров методов
После активации -parameters
для компиляции, можно применять reflection API для работы с параметрами методов и извлечения дополнительной информации.
Проверка доступности имен параметров
Java способна удивлять, поэтому не забудьте проверить, доступны ли имена параметров метода с помощью isNamePresent()
:
Parameter[] params = method.getParameters();
for (Parameter param : params) {
if (param.isNamePresent()) {
// Здорово, имена параметров идентифицируемы!
} else {
// Увы, требуется резервный вариант.
}
}
Извлечение метаданных параметров в классе
Если вам требуется определить имена и типы параметров для каждого метода класса:
for (Method method : YourClass.class.getDeclaredMethods()) {
for (Parameter param : method.getParameters()) {
// Теперь у вас в распоряжении имя и тип параметра.
}
}
Альтернативы для ключа -parameters
Если использование -parameters
не представляется возможным, рассмотрите эти альтернативы для доступа к именам параметров:
Библиотека Paranamer: извлекает имена параметров, если в байт-коде присутствует отладочная информация:
JavaСкопировать код// 'method' – объект класса java.lang.reflect.Method Paranamer paranamer = new CachingParanamer(); String[] parameterNames = paranamer.lookupParameterNames(method); // Благодаря Paranamer!
Spring Framework: он также умеет извлекать имена параметров:
JavaСкопировать кодDefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer(); String[] parameterNames = discoverer.getParameterNames(method); // Используем Spring.
Визуализация
Представьте себя детективом (🕵️♂️), который изучает ящик с уликами (📦). Каждый предмет снабжён ярлыком с подробностями (🏷️).
ЗАДАНИЕ: Установить личность звонившего и определить значение каждого предмета.
ИНСТРУМЕНТ: Java Reflection (🔍).
Определение имен параметров метода:
public void analyseEvidences(String fingerprints, String DNA) {
// Как понять, что 'fingerprints' и 'DNA' – это имена параметров?
}
Java Reflection и ключ -parameters
предоставляют необходимую информацию:
🕵️♂️🔍📦: [🏷️fingerprints, 🏷️DNA]
# Reflection раскрывает имена, часть загадки разрешена!
Код, скомпилированный с ключом -parameters
, позволяет детективу увидеть реальные имена, что облегчает расследование!
Обход потенциальных ловушек и освоение эффективных методов
Работа с Paranamer
Paranamer весьма универсален, но требует наличия отладочной информации в байт-коде. Компилируйте свой код с применением ключа -g
. Участвуйте в совершенствовании инструмента, создавайте запросы на исправление ошибок или pull request на GitHub-странице проекта.
Использование описательного нейминга как запасного варианта
Если доступ к именам параметров не представляется возможным, а Paranamer не подходит, используйте описательное именование параметров, такого типа как intParam
, stringParam
. Это не может заменить оригинальные имена, но предоставляет контекст для использования API.
Отражение публичных методов
Если нельзя изменить стратегию компиляции, сосредоточьтесь на публичных методах. Java API и множество сторонних библиотек сохраняют имена параметров для публичных методов.
Полезные материалы
- Официальная документация Oracle по работе с параметрами — Информация о доступе к именам параметров методов при помощи Java Reflection.
- Документация по классу Parameter в Java SE 8 — Официальная документация по классу
Parameter
. - nipafx // You. Me. Java. — Подсказки и лучшие практики по Reflection для методов.
- Paranamer на GitHub — Инструмент для доступа к именам параметров для версий Java.