Java,将非静态方法传递给另一个方法

时间:2014-03-18 16:44:33

标签: java methods non-static

这是我的程序的设置。我想告诉方法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

上面的解决方案显然不适用于传递非静态方法。

我有一种感觉,如果我重新排列它可能会起作用,但我无法弄明白。任何帮助将不胜感激!

3 个答案:

答案 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的示例中没有区别。