AspectJ 围绕建议

AspectJ Around Advice

我正在写硕士论文,题目是"Aspect-oriented software development"。我必须在 AspectJ 中做一个简单的项目,所以我用 AspectJ 设置了 Eclipse。

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

1) message_out。 java

2) message_test。 java

3) simple_aspect。 j

在 simple_aspect 文件中:

1) BEFORE 和 AFTER 建议按(我认为)预期的方式工作 - 所以,我 "commented" 他们出来了。

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);
    }
}

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

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);
}

下面的摘录帮助我理解了 "one argument",从而将逻辑应用于 "two arguments"。

摘自本书:

1) ARGS 指示符为关联的建议代码提供访问最初传递给 helloWorldUnique() 方法的参数的权限。

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

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

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

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

6) 当切入点 uniqueLog 被触发时,其由 s 变量定义的字符串参数可用于 before() 通知主体。