Получение имени параметра метода

В Java 6, представьте, что у меня есть следующая подпись метода:

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard)

Я хотел бы знать, во время выполнения, значение, переданное в slice2 или любой другой параметр, важный бит здесь заключается в том, что я хочу получить значение по имени параметра.

Я знаю, как получить список типов параметров с помощью getParameterTypes или getGenericParameterTypes.

В идеале я хотел бы получить список имен параметров вместо типов. Есть ли способ сделать это?

Ответ 1

Имена параметров доступны, если вы сказали компилятору включить их (скомпилировать с информацией об отладке). Spring имеет ParameterNameDiscoverer, который поможет вам получить имена. реализация по умолчанию использует asm ClassReader, чтобы сделать поэтому.

С javac вы должны включить аргумент -g, чтобы включить отладочную информацию. С Eclipse я думаю, что он есть по умолчанию; его можно настроить с помощью настроек: Java → Compiler и затем включить "Сохранить информацию о параметрах метода (можно использовать с помощью отражения)" (см. также этот ответ).

Некоторые структуры используют это. Например, spring -mvc имеет @RequestParam, который по умолчанию имеет имя параметра, если оно разрешимо. Он также поддерживает явное присвоение имен - @RequestParam("foo") в случае отсутствия отладочной информации.

Ответ 2

Я нашел другое решение после того, как он ответил на этот вопрос. Решение Paranamer.

Пример:

 Method method = Foo.class.getMethod(...);

 Paranamer paranamer = new CachingParanamer();

 String[] parameterNames = paranamer.lookupParameterNames(method) // throws ParameterNamesNotFoundException if not found

 // or ...

 parameterNames = paranamer.lookupParameterNames(method, false) // will return null if not found

Ответ 3

Это невозможно. Файлы классов не содержат имена аргументов, как вы можете видеть с автозавершением IDE, когда источник недоступен.

Следовательно, API отражения не может выдавать имена параметров.

Ответ 4

В именах параметров Java недоступны через отражение.

Ответ 5

В дополнение к этому ответ: "Имена параметров доступны, если вы сказали компилятору включить их"

Если вы используете Eclipse, перейдите в проект → свойства → Компилятор Java → отметьте "Сохранить информацию о параметрах метода (можно использовать с помощью отражения)

Ответ 6

Вы можете просто присвоить значение параметра другому значению

Bread slice2;

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard) {
    this.slice2 = slice2;
    System.out.println(this.slice2.getSomething());
}

Ответ 7

У вас есть код метода? Вы могли бы аннотировать параметры и передавать имена в качестве аргументов @Param("slice1"). Позже вы сможете получить аннотацию и извлечь из нее имя параметра.