Java 在参数数量不同的多个方法上使用invoke
我的这个类充满了带注释的方法:Java 在参数数量不同的多个方法上使用invoke,java,reflection,annotations,Java,Reflection,Annotations,我的这个类充满了带注释的方法: @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
@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(),但我不知道如何调用这两个方法,因为它们各自有不同数量的参数。有什么帮助吗
这里没有与反射混淆的地方,只是一个关于设计的问题,这样无论每个方法使用多少参数,invoke都会调用每个方法。您需要检查该方法的参数,然后相应地调整参数。对此没有立即的解决方案。使用反射调用方法的框架(如您正在尝试的)通常有一个
ArgumentResolver
。该对象基本上是一种生成方法所需参数的策略。您必须为该方法可能采用的每种类型的参数创建一个ArgumentResolver
。您可以将它们放入列表中
,并为该方法采用的每种参数类型获取相应的参数
可以通过调用获取方法的参数类型
例如,Spring使用一个调用的接口来决定并实例化一个对象,并将其作为参数传递给控制器方法。每个实现都知道它支持哪种类型的参数,并知道如何创建它。使用
方法.getParameterTypes()
获取方法的参数,并构造一个匹配参数值数组,以传递给调用测试如下参数数量:
for (Method m : methods) {
int nParams = m.getGenericParameterTypes().length;
switch(nParams) {
case 0:
...
}
}
请注意,这是一个设计问题-反射工作正常。您不能用两个参数调用不带参数的方法。我理解这一点,并且我知道如何调用另一个方法,以便它是唯一运行的方法。但是,我想知道我是否可以调用一个invoke并运行两个方法。if-else循环比较方法名称?当你说为每种类型的参数创建ArgumentResolver时,你的意思是我可以为一种字符串类型创建一个ArgumentResolver,它将处理我想要传递到方法中的所有字符串吗?@febreezey是,您可以有一个StringArgumentResolver
,但必须设置默认值才能生成。您还可以在参数上添加注释,以给出ArgumentResolver
提示。