我有一个名为chooseDialog(String s,int i)的静态方法,我想根据提供给chooseDialog的参数在同一个类(Dialogs.class)内调用另一个方法。 s是所需方法的名称,我是它的单个参数。Android/Java:使用反射调用方法?
我已经尝试了很多教程,并花了几个小时阅读这个主题,但我似乎无法得到我到底需要做什么的牢固掌握。
任何想法?
谢谢!
我有一个名为chooseDialog(String s,int i)的静态方法,我想根据提供给chooseDialog的参数在同一个类(Dialogs.class)内调用另一个方法。 s是所需方法的名称,我是它的单个参数。Android/Java:使用反射调用方法?
我已经尝试了很多教程,并花了几个小时阅读这个主题,但我似乎无法得到我到底需要做什么的牢固掌握。
任何想法?
谢谢!
为什么要调用名称在字符串参数中传递的方法?你不能为不同的动作创建一个常量,然后使用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
Method method = Dialogs.getMethod(s, Integer.class);
method.invoke(null, i);
如果你只是想调用另一个静态方法的类,那么你可以使用别人已确定的方法:
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);
}
你真的需要反思吗? – dacwe 2011-02-04 09:21:32
虽然可能有一个很好的解决方案给你的问题,但最好发布你正在试图解决的实际问题。例如。你为什么想要做这种方法选择?通常有人可以找到解决潜在问题的OOP设计模式,而不是找到具体问题的解决方案。例如,工厂模式可能是您需要的,允许您选择类,然后提供所需的功能作为抽象消息的实现。不要让你的问题的细节让你忽略更大的图片。 – Ber 2011-02-04 09:22:14