在 JavaScript 中,可以动态创建和编辑对象的函数。Java对象的方法可以做到这一点吗?我本质上想要这样的东西:
public class MyObject{
private int x;
public MyObject(){x = 0;}
public myMethod(){}
}
MyObject foo = new MyObject();
后来调用了类似的东西:
foo.myMethod = new method({x = 42;});
这不是直接可能的,但你可以尝试这样的事情:
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;
}
};
}
在 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();
您无法以上面尝试演示的方式对其进行编辑,您可以模拟它的最接近的方法是拦截该方法。目前我能想到的唯一方法是使用MethodInterceptor
在cglib库中找到的方法来拦截该方法。
你不能做这个。在 javanew
中,方法是返回类 Object 的实例,而不是方法。有一件事是要理解的是 Javascript 是一种函数式编程语言,而 Java 是一种面向对象的语言。您不能将方法视为 java 中的对象,这也破坏了 java 封装的安全性。
是的,理论上是可能的,但你不想这样做。这种事情是黑魔法,如果你需要问这个问题,你还需要几年时间才能准备好使用它。
也就是说,您要完成的工作可能对 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;
}
}