Вопрос:

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

java reflection runtime java-6

27118 просмотра

8 ответа

3967 Репутация автора

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

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

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

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

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

Автор: Tiago Veloso Источник Размещён: 20.07.2011 09:39

Ответы (8)


2 плюса

5903 Репутация автора

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

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

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

2 плюса

8148 Репутация автора

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

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

0 плюса

843 Репутация автора

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

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

44 плюса

509665 Репутация автора

Решение

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

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

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

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

0 плюса

10572 Репутация автора

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

Автор: denis.solonenko Размещён: 20.07.2011 09:50

10 плюса

3967 Репутация автора

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

66 Репутация автора

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

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

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

1 плюс

186 Репутация автора

Начиная с 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
Вопросы из категории :
32x32