0

在 JavaScript 中,可以动态创建和编辑对象的函数。Java对象的方法可以做到这一点吗?我本质上想要这样的东西:

public class MyObject{
  private int x;
  public MyObject(){x = 0;}
  public myMethod(){}
}

MyObject foo = new MyObject();

后来调用了类似的东西:

foo.myMethod = new method({x = 42;});
4

5 回答 5

2

这不是直接可能的,但你可以尝试这样的事情:

public class MyObject {
    private int x;

    interface MyMethod {
        void call();
    }

    public MyObject() {
        x = 0;
    }

    public MyMethod myMethod = new MyMethod() {
        @Override
        public void call() {
            x = 42;
        }
    };
}
于 2013-08-25T14:38:41.693 回答
1

在 Java 中,你不能像在 Javascript 中那样做。

但是在 Java 中,您可以使用策略模式来实现这样的行为。例如,

public interface Strategy {
 void doSomething(MyObject obj);
}

public class BasicStrategy implements Strategy {
 public void doSomething(MyObject obj) {
  //do something
 }
}

public class AnotherStrategy implements Strategy {
 public void doSomething(MyObject obj) {
  obj.setX(42);
 }
}

public class MyObject {
  private Strategy actualStrategy = new BasicStrategy();
  private int x = 0;

  public void executeStrategy() {
   actualStrategy.doSomething(this);
  }

  public void setStrategy(Strategy newStrategy) {
    actualStrategy = newStrategy;      
  }

  public void setX(int x) {
   this.x = x;
  }
}

您可以使用以下代码在运行时更改方法的行为。

MyObject obj = new MyObject();
obj.setStrategy(new AnotherStrategy());
obj.executeStrategy();
于 2013-08-25T14:46:35.973 回答
1

您无法以上面尝试演示的方式对其进行编辑,您可以模拟它的最接近的方法是拦截该方法。目前我能想到的唯一方法是使用MethodInterceptorcglib库中找到的方法来拦截该方法。

于 2013-08-25T14:37:16.650 回答
0

你不能做这个。在 javanew中,方法是返回类 Object 的实例,而不是方法。有一件事是要理解的是 Javascript 是一种函数式编程语言,而 Java 是一种面向对象的语言。您不能将方法视为 java 中的对象,这也破坏了 java 封装的安全性。

于 2013-08-25T15:28:13.293 回答
0

是的,理论上是可能的,但你不想这样做。这种事情是黑魔法,如果你需要问这个问题,你还需要几年时间才能准备好使用它。

也就是说,您要完成的工作可能对 Strategy 设计模式是可行的。这里的想法是您定义一个interface具有您需要换出的方法(例如,calculate()),并且您想要更改其行为的类具有该接口的一个字段。然后,您可以修改该字段的内容。

public interface Calculator {
    double calculate(double x, double y);
}

public class MathStuff {
    private Calculator calc;
    ...
    public void doStuff() {
         ...
         result = calc.calculate(x, y);
         ...
    }
}

public class Add implements Calculator {
    public double calculate(double x, double y) {
        return x + y;
    }
}
于 2013-08-25T14:50:48.463 回答