获取方法参数的名称

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

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

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

我知道如何使用getParameterTypesgetGenericParameterTypes获取参数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")传递。 稍后,您将能够获取注释并从中提取参数名称。