在多个方法上使用不同数量的参数调用

时间:2013-08-28 17:45:45

标签: 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 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都会调用每个方法。

4 个答案:

答案 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:
            ...

        }
    }