??? ??? target 切入點(diǎn)格式如下: target ([ Type | Identifier ])。 Type 指示對(duì)連接點(diǎn)處的對(duì)象類(lèi)型提供一個(gè)靜態(tài)編譯時(shí)評(píng)估,并采用完全限定類(lèi)名的形式(也就是說(shuō), Type 不能是使用通配符的類(lèi)型聲明模式)。 Identifier 提供了一種方法,可通過(guò)它來(lái)評(píng)估連節(jié)點(diǎn)處的運(yùn)行時(shí)對(duì)象的實(shí)際類(lèi)型,而不僅僅是靜態(tài)類(lèi)型。 Identifier 在運(yùn)行時(shí)動(dòng)態(tài)地賦予合適的對(duì)象。
??? ??? 下面通過(guò)例子說(shuō)明一下 target 的使用:
public interface Animal {
??? void speak();
}
public class Cat implements Animal{
??? public void speak() {
??? ??? System. out .println( " 喵喵 " );
??? }
}
public class Dog implements Animal{
??? public void speak() {
??? ??? System. out .println( " 汪汪 " );
??? }
}
public class Zoo {
??? private List<Animal> animals = new ArrayList<Animal>();
??? public void addAnimal(Animal a){
??? ??? animals .add(a);
??? }
??? public void speak(){
??? ??? for (Animal a : animals ){
??? ??? ??? ??? a.speak();
??? ??? }
??? }
}
???
定義一個(gè)切入點(diǎn)如下:
public pointcut speakCallOne():
??? call (* speak()) && target (Animal);
??? ??? 雖然 pointcut speakCallOne() 中的 call (* speak()) 匹配所有類(lèi)的 speak() 方法(這里匹配 Cat 、 Dog 、 Zoo ),但 target (Animal) 便將 pointcut speakCallOne() 限定在 Animal 及其子類(lèi)(也就是 Cat 、 Dog ,而不包含 Zoo )。這里當(dāng)然可以使用 call (* Animal.speak()) 來(lái)代替 target 。和靜態(tài)的類(lèi)型聲明不同, target 并不能靜態(tài)地確定的每一個(gè)連接點(diǎn),因?yàn)槠ヅ涫腔谶\(yùn)行時(shí)的類(lèi)型信息。在使用 AJDT 的情況下,可以看到 target 和靜態(tài)的類(lèi)型聲明的不同:
??? ?? 1)使用靜態(tài)的類(lèi)型聲明的圖示:

??? ?? 2)使用target的圖示:


??? ??? 對(duì)于target(Identifier)的使用,示例如下:
??? publicpointcut speakCallTwo(Object o):
??? ??? call(* Animal.speak()) && target(o);
??? ??? before(Object o):speakCallTwo(o){
??? ??? ??? ??? System.out.println(o.getClass());
??? ??? }
??? }
??? ??? 通過(guò)將 target付給 Object o,可以在before通知中調(diào)用 o的一些操作。
??? ??? this是target指示符的一個(gè)補(bǔ)充,它的格式與target相同。在含義上,this表示切入點(diǎn)所匹配的方法的調(diào)用類(lèi),而target表示匹配方法的目標(biāo)類(lèi)。例如:
??? ??? publicpointcut anotherSpeakCall():
??? ??? ??? call(* speak()) && target(Animal) && this(Zoo);
??? ??? target(Animal) 表示void speak()方法是Animal及子類(lèi)的,它不會(huì)匹配 Zoo的void speak()方法。而this(Zoo)會(huì)匹配調(diào)用了Animal及子類(lèi)的void speak()方法的 Zoo類(lèi)的方法,這里就是Zoo的void speak()方法。
??? ??? 如上便是關(guān)于target和this的基本用法。該文參考了《Eclipse AspectJ》和《AspectJ cookbook》。