Как быстро изменить поведение скомпилированных Java-классов с aspectJ - PullRequest
3 голосов
/ 12 января 2009

Как использовать aspectJ, чтобы временно добавить функциональность в некоторые Java-приложения? Что-то вроде создания аспекта, компиляции с помощью ajc, использования команды java с дополнительным переключателем для применения аспекта?

1 Ответ

5 голосов
/ 12 января 2009

Вопрос, я полагаю, заключается в том, можете ли вы включить / отключить код, спроектированный Aspectj во время выполнения.

Я не знаю, есть ли в AspectJ встроенный механизм, но я уверен, что вы можете заключить Код в Aspect с помощью условного выражения. Тогда все, что вам нужно сделать, это включить или выключить этот код во время выполнения

например

// HelloWorld.java
public class HelloWorld {
    public static void say(String message) {
        System.out.println(message);
    }

    public static void sayToPerson(String message, String name) {
        System.out.println(name + ", " + message);
    }
}


// PoliteHelloWorld.java
public aspect PoliteHelloWorld {
    pointcut callSayMessage() : call(public static void HelloWorld.say*(..));
    before() : callSayMessage() {
        if( is_aspectj_turned_on_this_run() ) {
            System.out.println("Good day!");
        }
    }
    after() : callSayMessage() {
        if( is_aspectj_turned_on_this_run() ) {
            System.out.println("Thank you!");
        }
    }
}

Как вы хотите реализовать "is_aspect_j_turned_on_this_run()", зависит от вас (может быть, задано аргументами командной строки или пользовательским вводом?)

Существует лучший способ - исправить аспект, который обрабатывает аспект, который вы хотите отключить во время выполнения. Этот новый дополнительный аспект будет отвечать только за проверку вашего "is_aspect_j_turned_on_this_run()". Подробнее об этом способе очистки смотрите здесь

Я не знаю, есть ли лучший способ сделать это, чем эти два метода (очень хорошо может быть), но это по крайней мере позволяет вам включать и выключать его во время выполнения столько раз, сколько вы хотите, без перекомпиляции.

...