获取方法参数的名称

Tia*_*oso 23 java reflection runtime java-6

Java 6中,想象一下我有以下方法签名:

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard)
Run Code Online (Sandbox Code Playgroud)

我想知道,在运行时,传递给slice2或任何其他参数的值,这里重要的一点是我想通过参数名称获取值.

我知道如何用getParameterTypes或获取参数类型列表getGenericParameterTypes.

理想情况下,我想获得一个参数名称列表而不是类型.有办法吗?

Boz*_*zho 45

如果您已告知编译器包含它们(使用调试信息进行编译),则可以使用参数名称.Spring有 ParameterNameDiscoverer可以帮助您获取名称.该默认实现使用ASM ClassReader这样做.

有了javac你应该包括-g参数包括调试信息.使用Eclipse,我认为它默认存在; 可以使用首选项配置它:Java - > Compiler,然后启用"存储有关方法参数的信息(可通过反射使用)"(另请参阅此答案).

一些框架使用它.例如,spring-mvc @RequestParam默认为param名称,如果可解析的话.它还支持显式命名 - @RequestParam("foo")如果没有提供调试信息.


Tia*_*oso 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
Run Code Online (Sandbox Code Playgroud)


Jam*_*udd 5

从 Java 1.8 开始,只要参数名称在类文件中,就可以做到这一点。使用javac它完成传递-parameters标志。从javac帮助

-parameters    Generate metadata for reflection on method parameters
Run Code Online (Sandbox Code Playgroud)

在 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出将取决于参数名称是否在类文件中。如果他们是输出是:

myFirstParameter
mySecondParameter
Run Code Online (Sandbox Code Playgroud)

如果不是,则输出为:

arg0
arg1
Run Code Online (Sandbox Code Playgroud)

可以在获取方法参数的名称中找到来自 Oracle 的更多信息