2015-06-20 66 views
-2

我在寫我的碩士論文,標題是「面向方面的軟件開發」。我必須在AspectJ中做一個簡單的項目,所以我使用AspectJ來設置Eclipse。AspectJ Around Advice

我無法理解AROUND的建議。我創建了3個文件:

1)message_out。 java

2)message_test。 java

3)simple_aspect。 AJ

在simple_aspect文件:預計

1)before和after建議正在爲(我認爲) - 所以,我 「評論說:」 出來。

2)around建議只適用於MESSAGE_ONE()方法。

我的問題是:

1)任何人都可以請解釋我(從simple_aspect文件)落後於around通知(WHYTHIS,WHYTHAT)命名參數的邏輯?

2)如何使方面接受並從MESSAGE_TWO改變TWO arugments(消息)()方法。

謝謝:)

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

解釋爲什麼你或其他人選擇了某些變量名?無論如何,我可能會通過一個AspectJ教程 - 如果這是您的論文,我會從學習所選工具開始。描述建議早在我見過的問答教程和書籍中就已經介紹過了,因爲它非常重要。 –

+0

我仍在學習AspectJ並試圖理解Java(我是Java新手)。這就是爲什麼一次難以理解和「連接」這兩種工具的原因。我住的地方不可能拿到這類書籍,我也不喜歡獲得數字(非法律)副本。另外,關於AspectJ的書籍(最後我不得不從網絡中獲得的)爲這些成員提供了一些先進的術語(aka newbs),以完全摒棄它,並且我認爲每個人(包括我)都沒有有時間閱讀所有材料,並完全理解所有內容,只是寫一個簡單的例子。 – 0v3rl0rd

回答

0

所以,發現了一本書: 「從等級掌握AspectJ」 cki J.和Lasiecki N.花了我幾個小時的時間來了解周圍建議背後的邏輯。我仍然沒有完全理解,但我明白了它應該如何工作。

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)切入點根據連接點和參數指示符的組合完全定義單個參數。

5)因此,如果切入點期待一個叫做s字符串,應該有一個字符串參數,並與定義爲s變量的峪指示符定義的連接點。

6)當pointcut uniqueLog被觸發時,由s變量定義的String參數可用於before()通知主體。

+0

親愛的霸王,因爲你似乎是StackOverflow的新手,所以我建議你接受你自己的答案,如果它解決了你的問題才能解決問題。另一種選擇是完全刪除這個問題。親切的問候。 – kriegaex

+0

感謝您的建議。我知道接受答案。事情是,我必須等待24小時才能接受我自己的答案(這裏的stackoverflow腳本告訴我這樣) – 0v3rl0rd