Как быстро изменить поведение скомпилированных Java-классов с aspectJ

StackOverflow https://stackoverflow.com/questions/435348

  •  10-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Думаю, вопрос в том, можете ли вы включить / отключить код, спроектированный 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 () " ;. Подробнее об этом более чистом методе см. здесь

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top