如何使用aspectJ临时向某些Java应用程序添加功能?有点像创建方面,使用ajc编译,使用带有一些额外开关的java命令来应用方面吗?
答案 0 :(得分:5)
我相信这个问题是你能否在运行时启用/禁用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()
”。有关此清洁方法的详细信息,请查看here
我不知道是否有比这两种方法更好的方法(非常好),但至少可以让你在运行时多次打开和关闭它而无需重新编译。