2013-08-25 172 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封裝的安全性。