例如:
我有一个像这样定义的方法:
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:我知道如何获取方法参数名称(通过编译调试),但我需要在调用时知道方法参数名称。
答案 0 :(得分: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的工作原理。
答案 1 :(得分:0)
您是否希望render()
方法找出其参数的变量名?
没有字节码操作,这是不可能的。
MVC框架可以在获取包含调用表达式的字符串时(例如在JSF和其他Web框架中)知道参数名称,但在获取包含实际调用的字节码时则不知道。
答案 2 :(得分:0)
目前,你永远不会看到任何阅读参数名称的框架。它们在对象属性级别 - 实例字段,getter和setter中工作。您可以在运行时使用反射找到它们。如果您想要使用自己的设备来消除样板,那么您仍然需要重新设计以使用对象属性的名称。