2015-05-29 76 views
0

有一個框架,包含了像4個功能:我們可以改變一個函數的實現嗎?

public long t1(){ 
    return 10; 
} 

public long t2(){ 
    return 20; 
} 

public long t3() { 
    return 30; 
} 

public long t4(){ 
    return (t2()-t1()); 
} 

我們可以改變T4的implementaion到:

public long t4(){ 
     return (t3() - t1()); 
    } 

地址:我們不能改變現有架構的FPGA實現。

add2:框架的這個類不是由用戶直接使用,所以我不能擴展它,並覆蓋該方法。

+1

爲什麼不創建自己的方法返回't3() - t1()' –

+0

嘗試方法覆蓋?擴展類並重寫只是方法t4()? – Gosu

+0

在語言:沒有。通過字節碼操作:是(取決於)。一個這樣的庫允許這樣的[Javassist](http://jboss-javassist.github.io/javassist/)。但是,如果可能的話,我會考慮代理(或外觀)。 – user2864740

回答

0

我們可以用method-overriding的概念覆蓋現有方法。

class Animal{ 

    public void move(){ 
     System.out.println("Animals can move"); 
    } 
} 

class Dog extends Animal{ 

    public void move(){ 
     System.out.println("Dogs can walk and run"); 
    } 
} 

public class TestDog{ 

    public static void main(String args[]){ 
     Animal a = new Animal(); // Animal reference and object 
     Animal b = new Dog(); // Animal reference but Dog object 

     a.move();// runs the method in Animal class 

     b.move();//Runs the method in Dog class 
    } 
} 
+0

該類不是直接使用的,所以我無法擴展並覆蓋該方法。 –

1

只有面向對象的Java或反射,你永遠不會實現你所要求的。

實際上,改變一個方法的實現是改變你的類的靜態部分。這在課程加載後無法實現。

但如何在加載類之前更改靜態部分?答案是:面向方面。然後,您可以在源代碼時更改類的靜態部分,編譯時間或類加載時間。

由於您不擁有源代碼,我認爲您使用的是預編譯的庫。所以你必須在課堂上課的時候這樣做。這是通過加載時織機完成的,例如使用AspectJ。

我建議添加一個環繞建議來短路當前的方法並執行你想要的語句。

總結:使用AspectJ與該方法的環繞建議。

相關問題