Отражение в Java: получение имени и типа параметров метода

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы определить имена параметров метода в Java Reflection, класс должен быть скомпилирован с ключом -parameters. Для доступа к именам применяется API java.lang.reflect.Parameter:

Java
Скопировать код
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 и так далее.

Кинга Идем в IT: пошаговый план для смены профессии

Сохранение имен параметров при компиляции

Без специального флага в байт-код классов Java не включаются имена параметров. Чтобы их сохранить, используйте опцию -parameters при компиляции.

Компиляция при помощи JDK

Bash
Скопировать код
javac -parameters YourClass.java

Компиляция с Maven

Добавьте ключ -parameters в настройки плагина maven-compiler-plugin в файле pom.xml:

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():

Java
Скопировать код
Parameter[] params = method.getParameters();
for (Parameter param : params) {
    if (param.isNamePresent()) {
        // Здорово, имена параметров идентифицируемы!
    } else {
        // Увы, требуется резервный вариант.
    }
}

Извлечение метаданных параметров в классе

Если вам требуется определить имена и типы параметров для каждого метода класса:

Java
Скопировать код
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.

Визуализация

Представьте себя детективом (🕵️‍♂️), который изучает ящик с уликами (📦). Каждый предмет снабжён ярлыком с подробностями (🏷️).

Markdown
Скопировать код
ЗАДАНИЕ: Установить личность звонившего и определить значение каждого предмета.
ИНСТРУМЕНТ: Java Reflection (🔍).

Определение имен параметров метода:

Java
Скопировать код
public void analyseEvidences(String fingerprints, String DNA) {
    // Как понять, что 'fingerprints' и 'DNA' – это имена параметров?
}

Java Reflection и ключ -parameters предоставляют необходимую информацию:

Markdown
Скопировать код
🕵️‍♂️🔍📦: [🏷️fingerprints, 🏷️DNA]
# Reflection раскрывает имена, часть загадки разрешена!

Код, скомпилированный с ключом -parameters, позволяет детективу увидеть реальные имена, что облегчает расследование!

Обход потенциальных ловушек и освоение эффективных методов

Работа с Paranamer

Paranamer весьма универсален, но требует наличия отладочной информации в байт-коде. Компилируйте свой код с применением ключа -g. Участвуйте в совершенствовании инструмента, создавайте запросы на исправление ошибок или pull request на GitHub-странице проекта.

Использование описательного нейминга как запасного варианта

Если доступ к именам параметров не представляется возможным, а Paranamer не подходит, используйте описательное именование параметров, такого типа как intParam, stringParam. Это не может заменить оригинальные имена, но предоставляет контекст для использования API.

Отражение публичных методов

Если нельзя изменить стратегию компиляции, сосредоточьтесь на публичных методах. Java API и множество сторонних библиотек сохраняют имена параметров для публичных методов.

Полезные материалы

  1. Официальная документация Oracle по работе с параметрами — Информация о доступе к именам параметров методов при помощи Java Reflection.
  2. Документация по классу Parameter в Java SE 8 — Официальная документация по классу Parameter.
  3. nipafx // You. Me. Java. — Подсказки и лучшие практики по Reflection для методов.
  4. Paranamer на GitHub — Инструмент для доступа к именам параметров для версий Java.