2013-08-25 136 views
0

在JavaScript中,可以即时创建和编辑对象的功能。这是可能的Java对象的方法?我想主要是这样的:在Java中创建对象之后编辑对象的方法

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

MyObject foo = new MyObject(); 

,过一会儿给沿着线的东西:

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

编号Java脚本被解释,而Java被编译。要改变类结构,你必须在运行时改变编译后的字节码。这在Java中很少用到,仅用于特殊目的,而不是日常编码。 –

回答

1

您不能在您尝试上述证明,最接近的方式编辑你可以做的模仿它的方法是拦截该方法。我现在想到的唯一方法是使用cglib库中的MethodInterceptor来拦截该方法。

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

或使'myMethod''专用',为它添加setter并使用'public void callMyMethod(){myMethod.call()}'来调用它,所以你在执行的地方有一个真实的方法(而不是'MyMethod'实例)。 – dst

1

在Java中,你不能做到这一点就像你会做在Javascript。

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

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(); 
0

是的,这在理论上是可行的,但你不想这样做。这种事情就是黑魔法,如果你需要提出这个问题,你已经准备好用好几年了。

也就是说,你试图完成的可能是。这里的想法是,你定义了一个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; 
    } 
} 
0

你不能这样做。在java new方法中返回类Object的实例,而不是方法。有一点要明白的是,Javascript是一种功能性编程语言,Java是一种面向对象的语言。你不能把一个方法当作java中的对象,也会破坏java封装的安全性。