Я могу получить название параметра метода с помощью отражения Java?

Если у меня есть класс как это:

public class Whatever
{
  public void aMethod(int aParam);
}

есть ли любой способ знать это aMethod использует названный параметр aParam, это имеет тип int?

116
задан Geo 10 February 2010 в 15:10
поделиться

6 ответов

Подведем итог:

  • получение имен параметров возможно , если отладочная информация включена во время компиляции. См. этот ответ для получения дополнительных сведений
  • в противном случае получение имен параметров не возможно
  • получение типа параметра возможно с помощью method.getParameterTypes ()

Для ради написания функции автозаполнения для редактора (как вы указали в одном из комментариев) есть несколько вариантов:

  • используйте arg0 , arg1 , arg2 и т. Д.
  • используйте intParam , stringParam , objectTypeParam и т. Д.
  • используйте комбинацию вышеперечисленного - первое для непримитивных типы, а последний - для примитивных типов.
  • вообще не показывают имена аргументов - только типы.
84
ответ дан 24 November 2019 в 02:15
поделиться

Вы можете получить метод с отражением и определить его типы аргументов. Проверьте http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29

Однако вы не можете определить имя используемого аргумента.

5
ответ дан 24 November 2019 в 02:15
поделиться

Имена параметров полезны только для компилятора. Когда компилятор создает файл класса, имена параметров не включаются - список аргументов метода состоит только из количества и типов его аргументов. Таким образом, было бы невозможно получить имя параметра с помощью отражения (как указано в вашем вопросе) - его нигде нет.

Однако, если использование отражения не является жестким требованием, вы можете получить эту информацию непосредственно из исходного кода (при условии, что она у вас есть).

0
ответ дан 24 November 2019 в 02:15
поделиться

Для добавления моих 2-х центов; информация о параметрах доступна в файле класса "для отладки", когда вы используете javac -g для компиляции исходников. И он доступен для APT, но вам понадобится аннотация, так что никакой пользы вам не будет. (Кто-то обсуждал что-то подобное 4-5 лет назад здесь: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )

В целом, вы не сможете получить его, если не будете работать непосредственно с исходными файлами (аналогично тому, что делает APT во время компиляции).

0
ответ дан 24 November 2019 в 02:15
поделиться

Это возможно, и Spring MVC 3 делает это, но я не нашел времени посмотреть, как именно.

Соответствие имен параметров метода с именами переменных шаблона URI может только в том случае, если ваш код скомпилирован с включенной отладкой. Если у вас отладка не включена, вы должны указать имя шаблона URI имя переменной в @PathVariable в аннотации @PathVariable для того, чтобы привязать разрешенное значение имени переменной к параметру метода. Например:

Взято из документации spring

3
ответ дан 24 November 2019 в 02:15
поделиться

Библиотека Paranamer была создана для решения этой же проблемы.

Он пытается определить имена методов несколькими способами. Если класс был скомпилирован с отладкой, он может извлечь информацию, прочитав байт-код класса.

Другой способ - добавить частный статический член в байт-код класса после его компиляции, но до того, как он будет помещен в jar. Затем он использует отражение для извлечения этой информации из класса во время выполнения.

https://github.com/paul-hammant/paranamer

У меня были проблемы с использованием этой библиотеки, но в конце концов она заработала. Я надеюсь сообщить о проблемах сопровождающему.

15
ответ дан 24 November 2019 в 02:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: