1

我有这个类充满了带有注释的方法:

@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() 的字符串,但我不知道如何调用这两种方法,因为它们都有不同数量的参数。有什么帮助吗?

这里没有与反射混淆,只是一个关于设计的问题,以便调用将调用每个方法,而不管每个方法有多少参数。

4

4 回答 4

3

对此没有直接的解决方案。使用反射来调用您尝试执行的方法的框架通常具有ArgumentResolver. 该对象基本上是一种用于生成方法所需参数的策略。您必须ArgumentResolver为该方法可能采用的每种类型的参数创建一个。您可以将它们放在 a 中List,并为该方法采用的每种参数类型获取适当的参数。

可以通过调用获取方法的参数类型Method.html#getParameterTypes()

例如,Spring 使用一个调用接口HandlerMethodArgumentResolver来决定和实例化一个对象,以作为参数传递给控制器​​方法。每个实现都知道它支持哪种类型的参数并知道如何创建它。

于 2013-08-28T17:53:39.247 回答
0

您将需要检查方法的参数类型,然后相应地调整参数。

于 2013-08-28T17:53:13.387 回答
0

用于Method.getParameterTypes()获取方法的参数并构造一个匹配的参数值数组以传递给invoke.

于 2013-08-28T17:56:23.033 回答
0

像这样测试参数的数量:

    for (Method m : methods) {
        int nParams = m.getGenericParameterTypes().length;
        switch(nParams) {
        case 0:
            ...

        }
    }
于 2013-08-28T18:03:36.520 回答