在JavaScript中,可以动态创建和编辑对象的功能。这可能是Java对象的方法吗?我基本上想要这样的东西:
public class MyObject{
private int x;
public MyObject(){x = 0;}
public myMethod(){}
}
MyObject foo = new MyObject();
后来打电话给:
foo.myMethod = new method({x = 42;});
答案 0 :(得分: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;
}
};
}
答案 1 :(得分:1)
您无法以上面尝试演示的方式对其进行编辑,您可以做的最接近的方法是拦截该方法。我目前唯一能想到的方法是使用MethodInterceptor
库中的cglib拦截方法。
答案 2 :(得分: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();
答案 3 :(得分:0)
是的,这在理论上是可行的,但你不想这样做。这种事情是黑魔法,如果你需要问这个问题,那么你已经准备好了几年了。
那就是说,你想要完成的事情可能适用于the Strategy design pattern。这里的想法是你定义一个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;
}
}
答案 4 :(得分:0)
你不能这样做。在java new
方法中,返回类Object的实例,而不是方法。有一点是要理解Javascript是一种函数式编程语言,而Java是一种面向对象的语言。您不能将方法视为java中的对象,也会破坏java封装的安全性。