Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用aspectJ快速修改已编译java类的行为_Java_Aop_Aspectj - Fatal编程技术网

如何使用aspectJ快速修改已编译java类的行为

如何使用aspectJ快速修改已编译java类的行为,java,aop,aspectj,Java,Aop,Aspectj,如何使用aspectJ向某些java应用程序临时添加功能?类似于创建aspect、使用ajc编译、使用java命令和一些额外的开关来应用aspect?问题是,我相信您能否在运行时启用/禁用Aspectj编写的代码 我不知道AspectJ中是否有内置机制,但我确信您可以使用条件语句将代码包装在Aspect中。然后,您需要做的就是在运行时打开或关闭代码 比如说 // HelloWorld.java public class HelloWorld { public static void sa

如何使用aspectJ向某些java应用程序临时添加功能?类似于创建aspect、使用ajc编译、使用java命令和一些额外的开关来应用aspect?

问题是,我相信您能否在运行时启用/禁用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!");
        }
    }
}
您希望如何实现“
是否启用此运行()
”取决于您(可能由命令行参数或用户输入设置?)

还有一种更好的方法,那就是更正一个方面,该方面处理您希望在运行时禁用的方面。这个新的额外特性将只负责检查您的“
特性是否已打开此运行()
”。有关此更干净方法的详细信息,请参见

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