假设我有Method1(void),Method2(void)......
有没有办法可以选择其中一个变量?
String MyVar=2;
MethodMyVar();
答案 0 :(得分:35)
使用反射:
Method method = WhateverYourClassIs.class.getDeclaredMethod("Method" + MyVar);
method.invoke();
答案 1 :(得分:9)
只能通过反思。请参阅java.lang.reflect
包。
您可以尝试以下方式:
Method m = obj.getClass().getMethod("methodName" + MyVar);
m.invoke(obj);
如果方法具有参数并且缺少各种异常处理,则代码可能会有所不同。
但问问你自己这是否真的有必要?可以对您的设计进行更改以避免这种情况。反射代码很难理解,并且比调用obj.someMethod()
慢。
答案 2 :(得分:6)
您可以使用策略设计模式以及您拥有的字符串到相应具体策略对象的映射。这是安全有效的手段。
所以,请进行HashMap<String,SomeInterfaceYouWantToInvokeSuchAsRunnableWithPseudoClosures>
查找。
,例如:
final static YourType reciever = this;
HashMap<String,Runnable> m = new HashMap<String,Runnable> {{
put("a", new Runnable() {
@Override public void run () {
reciever.a();
}
});
....
}};
// but check for range validity, etc.
m.get("a").run()
你也可以使用反射或“反转”问题并使用多态
答案 3 :(得分:0)
如果没有静态方法的第一个参数为method.invoke()
,我不确定接受的答案如何适用于null
(尽管虚拟值仍然有效)。根据{{3}}:
第一个参数是此特定的对象实例 方法是被调用的。 (如果方法是静态的,则第一个参数 应为null。)
以下显示了静态(按类)VS非静态(按实例)的完整示例( Main.java ),以及<的其他示例strong>带参数的方法,导入必要的类,捕获异常,以及超类方法示例。
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
class Love {
protected void Method4() {
System.out.println("calls super protected method by instance");
}
public void Method5() {
System.out.println("calls super public method by instance");
}
}
class Main extends Love {
static void Method2(int y) {
System.out.println("by class: " + y);
}
void Method3(String y) {
System.out.println(y);
}
public static void main(String[] args) {
String MyVar = "2";
String MyAnotherVar = "3";
String MySuperVar = "4";
String MySuperPublicMethodVar = "5";
Main m = new Main();
try {
Method method = Main.class.getDeclaredMethod("Method" + MyVar, int.class); //by class
Method anotherMethod = m.getClass().getDeclaredMethod("Method" + MyAnotherVar, String.class); //by instance
Method superMethod = m.getClass().getSuperclass().getDeclaredMethod("Method" + MySuperVar); //super method by instance, can be protected
Method superPublicMethod = m.getClass().getMethod("Method" + MySuperPublicMethodVar); //getMethod() require method defined with public, so even though sublcass calls super protected method will not works
try {
method.invoke(null, 10000);//by class
anotherMethod.invoke(m, "by instance"); //by instance
superMethod.invoke(m); //super method by instance
superPublicMethod.invoke(m); //super's public method by instance
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
输出:
$ javac Main.java
$ java Main
by class: 10000
by instance
calls super protected method by instance
calls super public method by instance
$