我的这个课程充满了带注释的方法:
@Test(value="checkLoginCredentials")
public void checkLogin(String username, String password) {
System.out.println("checkLogin has been called with " + username + " and " + password);
}
@Test(value="testOneFunctionality")
public void testOne() {
System.out.println("testOne has been called, and we have no parameters.");
}
然后我有一个驱动程序类,它使用@Test
注释调用方法调用:
Frame frame = new Frame();
Method[] methods = frame.getClass().getMethods();
for (Method m : methods) {
Test annos = m.getAnnotation(Test.class);
if (annos != null) {
try {
m.invoke(frame, (Object) new String ("uname"), (Object) new String ("pw"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
现在这只打印出checkLogin()而不是testOne()的字符串,但我不知道如何调用这两个方法,因为它们每个都有不同数量的参数。有什么帮助吗?
这里没有与Reflection的混淆,只是关于设计的问题,因此无论每个方法采用多少参数,invoke都会调用每个方法。
答案 0 :(得分:3)
目前还没有解决方案。使用反射来调用您尝试执行的方法的框架通常具有ArgumentResolver
。该对象基本上是一种生成方法所需参数的策略。您必须为该方法可能采用的每种类型的参数创建ArgumentResolver
。您可以将它们放在List
中,并为该方法采用的每种参数类型获取适当的值。
您可以通过调用Method.html#getParameterTypes()
来获取方法的参数类型。
例如,Spring使用一个名为HandlerMethodArgumentResolver
的接口来决定和实例化一个对象,以作为参数传递给控制器方法。每个实现都知道它支持哪种类型的参数,并知道如何创建它。
答案 1 :(得分:0)
您需要检查方法的parameter types,然后相应地调整参数。
答案 2 :(得分:0)
使用Method.getParameterTypes()
获取方法的参数,并构造匹配参数值数组以传递给invoke
。
答案 3 :(得分:0)
测试这样的参数数量:
for (Method m : methods) {
int nParams = m.getGenericParameterTypes().length;
switch(nParams) {
case 0:
...
}
}