Android / Java:使用反射调用方法?

时间:2011-02-04 09:17:01

标签: java android reflection methods

我有一个名为chooseDialog(String s,int i)的静态方法,其中我想根据提供给chooseDialog的参数调用同一类(Dialogs.class)中的另一个方法。 s是所需方法的名称,我是它的单个参数。

我已经尝试了很多教程,花了几个小时阅读这个主题,但我似乎无法掌握我究竟需要做什么。

有什么想法吗?

谢谢!

4 个答案:

答案 0 :(得分:16)

为什么要调用在String参数中传递名称的方法?您不能为不同的操作创建常量,然后使用switch并在每种情况下使用参数i调用方法?

您将受益于编译器检查代码是否存在错误。

编辑:如果您真的想使用反射,请使用以下内容检索Method对象:

Method m = YourClass.class.getMethod("method_name",new Class[] { Integer.class }) 

我猜Integer.class可能有效。然后调用metod

m.invoke(null,123); //first argument is the object to invoke on, ignored if static method

答案 1 :(得分:2)

Method method = Dialogs.getMethod(s, Integer.class);
method.invoke(null, i);

答案 2 :(得分:1)

如果您只想在课程上调用另一个静态方法,那么您可以使用其他人已经识别的方法:

Method method = Dialogs.getMethod(s, Integer.class);
method.invoke(null, i);

但是如果你想能够使用静态方法来调用非静态方法,那么你需要传入你想要引用的对象或使chooseDialog非静态。

function chooseDialog(Object o, String s, Integer i) {
    Method method = Dialogs.getMethod(o, Integer.class);
    method.invoke(o, i);
}

但我不认为这是处理问题的正确OOP方式。根据你的评论,反射并不是绝对必要的,并且选择对话分析字符串并将其传递给适当的方法是一种更加类型安全的方法。在任何一种方法中,您的单元测试应该看起来都一样。

    if (s.equals("dialog1")) {
        dialog1(i);
    }

答案 3 :(得分:0)

以下方法将调用该方法,并在成功时返回true:

public static boolean invokeMethod(Object object,String methodName,Object... args)  {
    Class[] argClasses = new Class[args.length];
    try {
        Method m = object.getClass().getMethod(methodName,argClasses);
        m.setAccessible(true);
        m.invoke(object,args);
        return true;
    } catch (Exception ignore) {
        return false;
    }

}

用法:invokeMethod(myObject,"methodName","argument1","argument2");