2013-02-15 9 views
0

Я инженер-программист в тесте, и я пытаюсь написать код, который может заменить метод производственной стороны, чтобы тест мог их выполнять. В принципе, я не хочу изменять производственный код для проверки.Выполнение изменения метода во время выполнения (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(); 
    } 

} 

Как вы можете видеть, когда основные исполняет, он будет печатать «A», так как он вызывает метод Printa на статический метод Foo(). Теперь во время выполнения есть способ, которым я могу впрыснуть или изменить такое, что 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

+0

Мне удалось сделать что-то подобное с помощью javassist (http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/) – Grim

ответ

1

Посмотрите на AspectJ.

Это обеспечивает advices, которые могут быть использованы для выполнения какого-то кода вокруг метода (до и после его исполнения), в то числе минуя вызов исходного метода в целом и возвращению некоторого arbirary значения

0

Если вы просто делаете это для тестирования классов, вы можете использовать насмешливую структуру, чтобы издеваться над классами на сервере. Мне нравится Mockito.

0

Вы можете сделать это самостоятельно, используя java reflection api, или вы можете использовать такой инструмент, как PowerMock.

+0

Я не верю, что размышления позволяют перекодировать код. Можете ли вы уточнить? – Student01

Смежные вопросы