Если у меня есть класс как это:
public class Whatever
{
public void aMethod(int aParam);
}
есть ли любой способ знать это aMethod
использует названный параметр aParam
, это имеет тип int
?
Подведем итог:
method.getParameterTypes ()
Для ради написания функции автозаполнения для редактора (как вы указали в одном из комментариев) есть несколько вариантов:
arg0
, arg1
, arg2
и т. Д. intParam
, stringParam
, objectTypeParam
и т. Д. Вы можете получить метод с отражением и определить его типы аргументов. Проверьте http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29
Однако вы не можете определить имя используемого аргумента.
Имена параметров полезны только для компилятора. Когда компилятор создает файл класса, имена параметров не включаются - список аргументов метода состоит только из количества и типов его аргументов. Таким образом, было бы невозможно получить имя параметра с помощью отражения (как указано в вашем вопросе) - его нигде нет.
Однако, если использование отражения не является жестким требованием, вы можете получить эту информацию непосредственно из исходного кода (при условии, что она у вас есть).
Для добавления моих 2-х центов; информация о параметрах доступна в файле класса "для отладки", когда вы используете javac -g для компиляции исходников. И он доступен для APT, но вам понадобится аннотация, так что никакой пользы вам не будет. (Кто-то обсуждал что-то подобное 4-5 лет назад здесь: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )
В целом, вы не сможете получить его, если не будете работать непосредственно с исходными файлами (аналогично тому, что делает APT во время компиляции).
Это возможно, и Spring MVC 3 делает это, но я не нашел времени посмотреть, как именно.
Соответствие имен параметров метода с именами переменных шаблона URI может только в том случае, если ваш код скомпилирован с включенной отладкой. Если у вас отладка не включена, вы должны указать имя шаблона URI имя переменной в @PathVariable в аннотации @PathVariable для того, чтобы привязать разрешенное значение имени переменной к параметру метода. Например:
Взято из документации spring
Библиотека Paranamer была создана для решения этой же проблемы.
Он пытается определить имена методов несколькими способами. Если класс был скомпилирован с отладкой, он может извлечь информацию, прочитав байт-код класса.
Другой способ - добавить частный статический член в байт-код класса после его компиляции, но до того, как он будет помещен в jar. Затем он использует отражение для извлечения этой информации из класса во время выполнения.
https://github.com/paul-hammant/paranamer
У меня были проблемы с использованием этой библиотеки, но в конце концов она заработала. Я надеюсь сообщить о проблемах сопровождающему.