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
提示。