AspectJ围绕建议

时间:2015-06-20 22:50:43

标签: java aspectj

我正在撰写我的硕士论文,标题是“面向方面的软件开发”。我必须在AspectJ中做一个简单的项目,所以我用AspectJ设置Eclipse。

我无法理解AROUND建议。我创建了3个文件:

1)message_out。的java

2)message_test。的java

3)simple_aspect。 AJ

在simple_aspect文件中:

1)之前和之后的建议正在按照(我认为)的预期进行 - 所以,我“评论”了它们。

2)around建议仅适用于MESSAGE_ONE()方法。

我的问题是:

1)任何人都可以解释我(来自simple_aspect文件)命名参数的逻辑背后的建议(WHYTHIS,WHYTHAT)??

2)如何使方面接受并更改MESSAGE_TWO()方法中的两个句子(消息)。

谢谢:)

message_out.java:

package mypackage;
public class message_out {
    public static void message_one(String message) {
        System.out.println(message);
    }
    public static void message_two(String message1, String message2) {
        System.out.println(message1 + ", " + message2);
    }
}

message_test.java:

package mypackage;
public class message_test {
    public static void main(String[] args) {
        message_out.message_one("AAAAA");
        message_out.message_two("BBBBB", "CCCCCC");
    }
}

simple_aspect.aj:

package mypackage;
public aspect simple_aspect {
    /*pointcut message_before() : call (* message_out.message_one(..));
    before() : message_before() {
        System.out.println("BEFORE");
    }

    pointcut message_after() : call (* message_out.message_one(..));
    after() : message_after() {
        System.out.println("AFTER");
    }*/

    pointcut message_around(String WHYTHIS) 
    : call(* message_out.message_one(String)) && args (WHYTHIS); 
    void around (String WHYTHAT) : message_around(WHYTHAT) {
        WHYTHAT = "CHANGED";
        proceed (WHYTHAT);
    }
}

1 个答案:

答案 0 :(得分:0)

所以,找到了一本书:来自Gradecki J.和Lasiecki N的“掌握AspectJ”。花了几个小时来了解周围建议背后的逻辑。我仍然没有完全理解它,但我知道它应该如何工作。

pointcut firstPointcut (String s, String t) : call (public void helloWorld(String, String)) && args (s, t);

void around (String s, String t) : firstPointcut (s, t) {
    System.out.println("1st passed value: " + s);
    System.out.println("2nd passed value: " + t);
    s = "changed first one"; 
    t = "changed second one";
    proceed (s, t);
}

下面的摘录帮助我理解了“一个论点”,从而将逻辑应用于“两个论点”。

从书中摘录:

1)ARGS指示符提供相关的建议代码,可以访问最初传递给helloWorldUnique()方法的参数。

2)方法签名中的单个参数类型 - 只应考虑具有单个参数的调用。

3)ARGS指示符只有一个参数。此参数与传递给定义为连接点一部分的方法的单个参数直接相关。

4)切入点完全根据连接点和args指示符的组合定义单个参数。

5)因此,如果切入点期望一个名为s的String,则应该有一个用String参数定义的连接点和一个带有定义为s的变量的args指示符。

6)当触发切入点uniqueLog时,s变量定义的String参数可供before()建议体使用。