如何在Java中调用方法时获取方法参数名称

时间:2012-04-15 09:10:49

标签: java

例如:

我有一个像这样定义的方法:

class MyController extends Controller {

   public void index() {
       String aa = "1111";
       int bb = 122;

       render("index.html", aa, bb);
   }
}

现在,我想获取参数名称:aa和bb来构建HashMap:

Map map = new HashMap();
map.set("aa", aa);
map.set("bb", bb);

我看到很多MVC框架都可以这样做,如何实现?反射或字节码黑客或编译时处理?

PS:我知道如何获取方法参数名称(通过编译调试),但我需要在调用时知道方法参数名称。

3 个答案:

答案 0 :(得分:1)

我认为您的MVC框架还有其他功能。 它可能使用反射提取方法参数的名称。 例如,如果您的方法渲染定义为

void render(String file, String a, String b)

您的框架(和您)可以获取参数'a'和'b'的名称。我怀疑有人可以获取本地方法变量aabb的名称,因为它们是在您的示例中编写的。

获取有关参数名称的一些数据的另一种方法是使用注释。您可以定义自定义注释(让我们称之为@Param),然后按如下方式使用它:

render(@Param("fileName") "index.html", @Param("aa") "aaaaa", @Param("bb") "bbbb");

现在您可以使用反射API提取参数名称。在方法定义或方法调用时,可以使用注释。

这就是Spring MVC的工作原理。

答案 1 :(得分:0)

您是否希望render()方法找出其参数的变量名?

没有字节码操作,这是不可能的。

MVC框架可以在获取包含调用表达式的字符串时(例如在JSF和其他Web框架中)知道参数名称,但在获取包含实际调用的字节码时则不知道。

答案 2 :(得分:0)

目前,你永远不会看到任何阅读参数名称的框架。它们在对象属性级别 - 实例字段,getter和setter中工作。您可以在运行时使用反射找到它们。如果您想要使用自己的设备来消除样板,那么您仍然需要重新设计以使用对象属性的名称。