获取方法参数的名称
在Java 6中 ,假设我有以下方法签名:
public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard)
我想知道,在运行时,传递给slice2
或任何其他参数的值,这里的重要一点是,我想通过参数名称获取值。
我知道如何使用getParameterTypes
或getGenericParameterTypes
获取参数types的列表。
理想情况下,我想获取参数名称而不是types的列表。 有没有办法做到这一点?
如果您已经告诉编译器将它们包含在内,那么参数名称是可用的(使用debugging信息编译)。 Spring有ParameterNameDiscoverer
,它可以帮助您获取名称。 默认实现使用asm ClassReader
来完成。
用javac
你应该包含-g
参数来包含debugging信息。 用Eclipse,我认为它是默认的。 可以使用首选项Java – > Compiler进行configuration,然后启用“存储有关方法参数的信息(可通过reflection使用)”(另请参阅此答案 )。
一些框架使用这个。 例如spring-mvc有@RequestParam
,如果可以parsing的话,默认是参数名。 它还支持显式命名 – @RequestParam("foo")
以防止提供debugging信息。
在回答这个问题后,我find了另一个解决scheme。 解决scheme是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
在Java中,参数名称不能通过reflection来使用。
这不可能。 类文件不包含参数名称,正如您在源代码不可用时使用IDE的自动完成function所看到的一样。
因此,reflectionAPI不能发出参数名称。
除了这个答案:“如果你告诉编译器包含它们,参数名是可用的”
如果您使用的是Eclipse,请转到项目 – >属性 – > Java编译器 – >选中“存储有关方法参数的信息(可通过reflection使用)
您可以简单地将该参数的值分配给另一个值
Bread slice2; public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard) { this.slice2 = slice2; System.out.println(this.slice2.getSomething()); }
你是否拥有该方法的代码? 您可以注释参数并将名称作为参数@Param("slice1")
传递。 稍后,您将能够获取注释并从中提取参数名称。