这是我的程序的设置。我想告诉方法checkerMethod使用哪个方法,来自method1或method2。
public Class executeCode{
World brave = new World();
brave.checkerMethod(Method method1);
}
我的世界课看起来像下面的内容。
public World{ // changed to World from World()
public World(){
//make world
}
public methodChecker(Method method){
//code involving using method1 or method2
//methods 1 and 2 are not static, so I would need to call this.method1()
}
public void method1(){//method here}
public void method2(){//method here}
}
我见过类似的事情,here, for instance
上面的解决方案显然不适用于传递非静态方法。
我有一种感觉,如果我重新排列它可能会起作用,但我无法弄明白。任何帮助将不胜感激!
答案 0 :(得分:4)
不要反复传递方法和做事,只需传入一个包装方法的可调用对象,然后关闭this
。
如果您传递的所有方法都是void
零参数方法,那么您可以使用java.lang.Runnable
// final local variables are available to inner classes
final World current = this;
World.methodChecker(
new Runnable() {
public void run() {
current.method1();
// Or alternatively {World.this.method1();}
}
});
如果您需要实际返回值或传递参数,那么
番石榴的Function
并不是一个糟糕的选择。
答案 1 :(得分:1)
你不能用Java(没有反射)来做这件事,但是你可以使用一个标志来标记要执行的确切方法:
public void methodChecker(boolean flag){
flag ? method1() : method2();
}
答案 2 :(得分:0)
正确的方法是考虑重新设计并制作methodN()
Runnable
而不是方法。
public class World {
public Runnable method1 = new Runnable() {
@Override
public void run() {
System.out.println("1");
}
};
public Runnable method2 = new Runnable() {
@Override
public void run() {
System.out.println("2");
}
};
public World() {
//make world
}
public void methodChecker(Runnable method) {
method.run();
}
}
当然可以将methodN()
作为方法并使用反射运行它们。这不是一个好习惯,调用速度较慢,您可能面临SecurityException
在其他环境中的风险。 在您别无选择之前不要使用反射。解决方案如下:
public class World {
public World() {
//make world
}
public void methodChecker(String method) {
try {
getClass().getMethod(method).invoke(this);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void method1() {
System.out.println("1");
}
public void method2() {
System.out.println("2");
}
}
静态方法调用的唯一区别是您将对象的引用传递给invoke
方法。在Runable
的示例中没有区别。