3

如何使用 aspectJ 为某些 java 应用程序临时添加功能?像创建方面,用ajc编译,使用java命令和一些额外的开关来应用方面?

4

1 回答 1

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()”。有关此更清洁方法的详细信息,请参见此处

我不知道是否有比这两种方法更好的方法(很可能),但这至少允许您在运行时根据需要多次打开和关闭它,而无需重新编译。

于 2009-01-12T19:30:21.613 回答