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

java reflection runtime java-6

27118 просмотра

8 ответа

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

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

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

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

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

Автор: Tiago Veloso Источник Размещён: 13.11.2019 11:46

Ответы (8)


44 плюса

Решение

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

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

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

Автор: Bozho Размещён: 20.07.2011 09:46

10 плюса

Я нашел другое решение после пометки этого вопроса в качестве ответа. Решение - 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
Автор: Tiago Veloso Размещён: 20.07.2011 09:53

3 плюса

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

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

Автор: Denis K Размещён: 04.05.2016 07:26

2 плюса

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

Автор: Leonard Brünings Размещён: 20.07.2011 09:42

2 плюса

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

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

Автор: slaphappy Размещён: 20.07.2011 09:41

1 плюс

Начиная с 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 можно найти в разделе Получение имен параметров метода.

Автор: James Mudd Размещён: 22.03.2019 01:15

0 плюса

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

Bread slice2;

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard) {
    this.slice2 = slice2;
    System.out.println(this.slice2.getSomething());
}
Автор: mastaH Размещён: 20.07.2011 09:44

0 плюса

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

Автор: denis.solonenko Размещён: 20.07.2011 09:50
Вопросы из категории :
32x32