Если у меня есть такой класс:
public class Whatever
{
public void aMethod(int aParam);
}
есть ли способ узнать, что aMethod
использует параметр с именем aParam
типа int
?
java
reflection
Geo
источник
источник
Ответы:
Подвести итоги:
method.getParameterTypes()
Для написания функции автозаполнения для редактора (как вы сказали в одном из комментариев) есть несколько вариантов:
arg0
,arg1
, иarg2
т.д.intParam
,stringParam
,objectTypeParam
и т.д.источник
В Java 8 вы можете делать следующее:
Итак, для вашего класса
Whatever
мы можем провести ручной тест:который должен печататься,
[aParam]
если вы передали-parameters
аргумент компилятору Java 8.Для пользователей Maven:
Для получения дополнительной информации см. Следующие ссылки:
источник
Библиотека Paranamer была создана для решения этой же проблемы.
Он пытается определить имена методов несколькими способами. Если класс был скомпилирован с отладкой, он может извлечь информацию, прочитав байт-код класса.
Другой способ - ввести частный статический член в байт-код класса после его компиляции, но до того, как он будет помещен в jar. Затем он использует отражение для извлечения этой информации из класса во время выполнения.
https://github.com/paul-hammant/paranamer
У меня были проблемы с использованием этой библиотеки, но в конце концов она заработала. Я надеюсь сообщить о проблемах сопровождающему.
источник
ParameterNAmesNotFoundException
см. класс org.springframework.core.DefaultParameterNameDiscoverer
источник
Да.
Код должен быть скомпилирован с помощью компилятора, совместимого с Java 8, с включенной опцией хранения формальных имен параметров ( опция -parameters ).
Тогда этот фрагмент кода должен работать:
источник
Вы можете получить метод с отражением и определить его типы аргументов. Проверьте http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29
Однако вы не можете сказать название используемого аргумента.
источник
Это возможно, и Spring MVC 3 это делает, но я не нашел времени, чтобы понять, как именно.
Взято из весенней документации
источник
Хотя это невозможно (как показали другие), вы можете использовать аннотацию, чтобы перенести имя параметра и получить его через отражение.
Не самое чистое решение, но оно выполняет свою работу. Некоторые веб-службы фактически делают это для сохранения имен параметров (например, развертывание WS с помощью Glassfish).
источник
См. Java.beans.ConstructorProperties , это аннотация, предназначенная именно для этого.
источник
Итак, вы должны уметь:
Но вы, вероятно, получите такой список:
Я считаю, что это будет исправлено в Groovy 2.5+.
Итак, в настоящее время ответ таков:
Смотрите также:
Для каждого метода нужно что-то вроде:
источник
aMethod
. Я хочу получить его для всех методов в классе.antlr
для этого имена параметров?если вы используете eclipse, см. изображение ниже, чтобы компилятор мог хранить информацию о параметрах метода.
источник
Как заявил @Bozho, это можно сделать, если во время компиляции включена отладочная информация. Здесь есть хороший ответ ...
Как получить имена параметров конструкторов объекта (отражение)? автор: @AdamPaynter
... используя библиотеку ASM. Я собрал пример, показывающий, как можно достичь своей цели.
Прежде всего, начните с pom.xml с этими зависимостями.
Затем этот класс должен делать то, что вы хотите. Просто вызовите статический метод
getParameterNames()
.Вот пример с модульным тестом.
Вы можете найти полный пример на GitHub
Предостережения
static
методами. Это связано с тем, что в данном случае количество аргументов, возвращаемых ASM, отличается, но это легко исправить.источник
Имена параметров полезны только компилятору. Когда компилятор создает файл класса, имена параметров не включаются - список аргументов метода состоит только из количества и типов его аргументов. Таким образом, было бы невозможно получить имя параметра с помощью отражения (как указано в вашем вопросе) - его нигде нет.
Однако, если использование отражения не является жестким требованием, вы можете получить эту информацию непосредственно из исходного кода (при условии, что она у вас есть).
источник
Parameter names are only useful to the compiler.
Неправильно. Посмотрите библиотеку модернизации. Он использует динамические интерфейсы для создания запросов REST API. Одна из его функций - возможность определять имена заполнителей в путях URL и заменять эти заполнители соответствующими именами параметров.Чтобы добавить мои 2 цента; информация о параметрах доступна в файле класса «для отладки», когда вы используете javac -g для компиляции источника. И он доступен для APT, но вам понадобится аннотация, поэтому от вас нет никакой пользы. (Кто-то обсуждал нечто подобное 4-5 лет назад здесь: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )
Короче говоря, вы не можете получить его, если не работаете с исходными файлами напрямую (аналогично тому, что APT делает во время компиляции).
источник