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)
从 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 的更多信息