0

例如:

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

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:我知道如何获取方法参数名称(通过调试编译),但调用时我需要知道方法参数名称。

4

3 回答 3

1

我认为你的 MVC 框架做了别的事情。它可能使用反射提取方法参数的名称。例如,如果您的方法渲染定义为

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

您的框架(和您)可以获得参数“a”和“b”的名称。我怀疑有人可以获得本地方法变量的名称,aa并且bb它们是在您的示例中编写的。

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

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

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

这就是 Spring MVC 的工作方式。

于 2012-04-15T09:23:31.537 回答
0

最终,您永远不会看到任何框架读取参数名称。它们在对象属性级别工作——实例字段、getter 和 setter。您可以在运行时通过反射找到它们。如果您想推出自己的工具来消除样板,您仍然必须重新设计以使用对象属性的名称。

于 2012-04-15T09:31:49.303 回答
0

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

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

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

于 2012-04-15T09:17:37.557 回答