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