下面是塞爾貝勒斯特的示例代碼變種,這使得它更清楚發生了什麼在Java中。原始類型如int
是不可改變的,但即使是一些簡單的內置對象類型,例如String
也是如此。雖然更復雜的類型,如Set
不是。
不同add
方法驅動應用:
package de.scrum_master.app;
import java.util.HashSet;
import java.util.Set;
public class Application {
public static int add(int i) {
i += 100;
return i;
}
public static String add(String text) {
text = "#" + text + "#";
return text;
}
public static Set<String> add(Set<String> set) {
set.add("new element");
return set;
}
public static void main(String[] args) {
add(10);
add("foo");
Set<String> mySet = new HashSet<>();
mySet.add("foo");
mySet.add("bar");
add(mySet);
}
}
方面捕捉所有add
方法,打印他們的參數和結果進行比較:
package de.scrum_master.app;
public aspect MyAspect {
pointcut addMethods(Object parameter) :
execution(* add(*)) && args(parameter);
after(Object parameter) returning (Object returnValue): addMethods(parameter) {
System.out.println(thisJoinPoint);
System.out.println(" parameter = " + parameter);
System.out.println(" return value = " + returnValue);
}
}
控制檯輸出:
execution(int de.scrum_master.app.Application.add(int))
parameter = 10
return value = 110
execution(String de.scrum_master.app.Application.add(String))
parameter = foo
return value = #foo#
execution(Set de.scrum_master.app.Application.add(Set))
parameter = [new element, foo, bar]
return value = [new element, foo, bar]
正如你所看到的,int
和String
參數保持不變,而Set
參數是可變的,因此更新。
@ Serge ..我有什麼辦法可以得到110.是否必須使用Field-Access切入點。 – user3797438 2014-10-08 08:36:01
@ user3797438:請參閱我的編輯 – 2014-10-08 08:54:14
但我得到相同的值... 10 – user3797438 2014-10-08 09:01:27