2013-02-15 40 views
0

我是Test中的一名軟件工程師,我試圖編寫代碼來替代生產端方法,以便測試可以執行這些方法。基本上,我不想修改可測試性的生產代碼。在運行時更改方法執行(Java)

下面是一個簡單的場景:

public class Foo { 

    public static void foo() { 
     printA(); 
    } 

    public static void printA() { 
     System.out.println("A"); 
    } 

    public static void printB() { 
     System.out.println("B"); 
    } 
} 

public class Foobar { 

    public Foobar() { 

    } 

    public void test() { 
     Foo.foo(); 
    } 

    public static void main(String[] args) { 
     //Try changing the method here 

     new Foobar().test(); 
    } 

} 

正如你可以看到,當主執行時,它會因爲它調用靜態方法foo方法printA()打印「A」。現在在運行時,有沒有一種方法可以注入或修改,這樣foo將調用printB而不是printA?

謝謝你的幫助!

+0

,可以用[儀表](http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html)來獲取對類字節的訪問,然後使用[ASM](http:// asm。 ow2.org/),[BCEL](http://commons.apache.org/bcel/)或其他字節碼分析/修改庫來修改該方法。 – Vulcan 2013-02-15 22:04:13

+0

我設法做一次這樣的事情,一次使用[javassist](http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/) – Grim 2013-02-15 22:06:18

回答

1

看看AspectJ

它提供advices,其可用於執行一些代碼周圍的方法(前和執行後),包括完全繞過該呼叫到原來的方法和返回一些arbirary值

0

如果你只是爲了測試類而這樣做,你可以使用一個模擬框架來模擬服務器上的類。我喜歡Mockito

0

你可以使用java反射api自己做,也可以使用像PowerMock這樣的工具。

+0

我不相信反射允許代碼交換。你能詳細說明嗎? – Student01 2013-02-15 22:50:45