获取方法参数的名称

2022-09-01 13:37:45

Java 6中,假设我有以下方法签名:

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

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

我知道如何使用 或 获取参数类型列表。getParameterTypesgetGenericParameterTypes

理想情况下,我希望获得参数名称而不是类型的列表。有没有办法做到这一点?


答案 1

如果您已告诉编译器包含参数名称(使用调试信息编译),则可以使用参数名称。Spring有参数名称发现器,可以帮助您获取名称。默认实现使用 asm ClassReader 来执行此操作。

您应该包括参数以包括调试信息。对于Eclipse,我认为它默认存在;它可以使用首选项进行配置:Java ->编译器,然后启用“存储有关方法参数的信息(可通过反射使用)”(另请参阅此答案)。javac-g

一些框架使用它。例如,spring-mvc 具有默认为参数名称(如果可解析)的参数。它还支持显式命名 - 以防未提供调试信息。@RequestParam@RequestParam("foo")


答案 2

在将此问题标记为已回答后,我找到了另一种解决方案。解决方案是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