2011-02-04 189 views
7

我有一个名为chooseDialog(String s,int i)的静态方法,我想根据提供给chooseDialog的参数在同一个类(Dialogs.class)内调用另一个方法。 s是所需方法的名称,我是它的单个参数。Android/Java:使用反射调用方法?

我已经尝试了很多教程,并花了几个小时阅读这个主题,但我似乎无法得到我到底需要做什么的牢固掌握。

任何想法?

谢谢!

+0

你真的需要反思吗? – dacwe 2011-02-04 09:21:32

+1

虽然可能有一个很好的解决方案给你的问题,但最好发布你正在试图解决的实际问题。例如。你为什么想要做这种方法选择?通常有人可以找到解决潜在问题的OOP设计模式,而不是找到具体问题的解决方案。例如,工厂模式可能是您需要的,允许您选择类,然后提供所需的功能作为抽象消息的实现。不要让你的问题的细节让你忽略更大的图片。 – Ber 2011-02-04 09:22:14

回答

13

为什么要调用名称在字符串参数中传递的方法?你不能为不同的动作创建一个常量,然后使用switch,并在每种情况下调用参数为i的方法?

您将有编译器检查错误代码的好处。

编辑:如果你真的想使用反射,检索Method对象有:

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

我猜Integer.class可能会奏效。然后调用梅托德作为

m.invoke(null,123); //first argument is the object to invoke on, ignored if static method 
2
Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 
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方式。并根据您的意见,反思并不是绝对必要的,并选择Dialog分析字符串,并将其传递给适当的方法是一种更安全的方法。在任何一种方法中,你的单元测试应该看起来都一样。

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