Использовать имя переменной семантически в Java - PullRequest
5 голосов
/ 19 марта 2019

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

public Response loginAttempt(@MyParam("username") String username, @MyParam("password") String password) {
    // login logic here
}

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

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

Я знаю, что в предыдущей версии Java это просто невозможно сделать. Я также знаю, что Java выпускает версии быстрее, чем когда-либо прежде, с новыми и более современными функциями, чем когда-либо прежде. К сожалению, отношение сигнал / шум с 15-летней информацией слишком просто недостаточно для получения окончательного ответа. Это то, что можно сделать с помощью современной Java?

1 Ответ

5 голосов
/ 19 марта 2019

Начиная с Java 8, если вы компилируете свой код с параметром javac -parameters и параметры метода будут сохранены, однако есть недостатки . Проблема, прежде всего, в размере файла класса, посмотрите на Получение имен параметров метода docs.

Вы можете использовать java.lang.reflect.Parameter.getName(), чтобы получить имя параметра метода:

Method m = getClass().getMethods()[0];
System.out.println(m.getName()); // loginAttempt
Parameter[] parameters = m.getParameters();
for (Parameter parameter : parameters) {
    System.out.print(parameter.getName() + " "); // username password
}
...