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

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

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

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

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

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

7 ответов

Решение

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

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

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

Я нашел другое решение после пометки этого вопроса в качестве ответа. Решение - 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

Начиная с Java 1.8, это можно сделать, если имена параметров находятся в файлах классов. С помощью javac это сделано, передавая -parameters флаг. От javac Помогите

-parameters    Generate metadata for reflection on method parameters

Из IDE вам нужно будет посмотреть настройки компилятора.

Если имена параметров находятся в файлах классов, то вот пример этого

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class ParameterNamesExamples {

  public static void main(String[] args) throws Exception {
    Method theDoSomethingMethod = ExampleClass.class.getMethods()[0];
    // Now loop through the parameters printing the names
    for(Parameter parameter : theDoSomethingMethod.getParameters()) {
      System.out.println(parameter.getName());
    }
  }

  private class ExampleClass {
    public void doSomething(String myFirstParameter, String mySecondParameter) {
      // No-op
    }
  }
}

Вывод будет зависеть от того, есть ли имена параметров в файлах классов. Если они выводятся:

myFirstParameter
mySecondParameter

Если нет, то вывод:

arg0
arg1

Более подробную информацию об этом из Oracle можно найти в разделе Получение имен параметров метода.

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

Если вы используете Eclipse, перейдите в проект -> свойства -> Java Compiler -> check "Хранить информацию о параметрах метода (используется через отражение)

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

Поэтому API отражения не может выдавать имена параметров.

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

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

Bread slice2;

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

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

Другие вопросы по тегам