私とaspectjの11---target()this()within()の違いを学びます


keyword:target this within difference区別
上の段階の学習を経て、この3つのキーワードを知っているかもしれませんが、フィルタリングに使われていることが多いです.あなたは迷っていますか:いったい彼らはどんな違いがありますか?まずテスト環境を構築します.次のコードがあります.
package com.aspectj.demo.different;

public interface Animal {

	
	public void move();
}
package com.aspectj.demo.different;

public class Snake implements Animal{

	public void move() {
		System.out.println("Snake is moving ....");
	}

}
package com.aspectj.demo.different;

public class Bird implements Animal {

	public void move() {
		System.out.println("Snake is flying ....");
	}

}
package com.aspectj.demo.different;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class TestMove {

	
	public void move(List<Animal> list){
		for(Animal a : list){
			a.move();
		}
	}
	
	@Test
	public void testAA(){
		List<Animal> list = new ArrayList<Animal>();
		list.add(new Bird());
		list.add(new Snake());
		move(list);
	}
}

これが私たちのテスト環境です.1つのAnimalインタフェース、2つの実装クラスSnakeとBird、TestMoveテストクラスです.彼らはmove()の方法を持っています.では、次は異なるpointcutを提供します.まず出力結果を見てみましょう.必ずテストごとのpointcutの詳細の変化をよく見て、コードcopy(または手動入力)をeclipseに入力して、実行して、結果を見て、心を込めて体得してください.多くのものは私たちが理解することができて、伝えることができません.次にまとめます.
1、テスト1
    
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.Animal;

public aspect MoveAspect {

	pointcut MoveAspect() :   call(* move(..));
	
	
	before() : MoveAspect(){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation());
	} 
	
}

印刷結果は次のとおりです.
Entering TestMove.java:22
Entering TestMove.java:13
Snake is flying ....
Entering TestMove.java:13
Snake is moving ....

結果:すべてのmoveがブロックされました(..)メソッド呼び出しポイント.
2、テスト2
      
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.Animal;

public aspect MoveAspect {

	pointcut MoveAspect() :   call(* move(..)) && target(Animal);
	
	
	before() : MoveAspect(){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation());
	} 
	
}

印刷:
 
Entering TestMove.java:13
Snake is flying ....
Entering TestMove.java:13
Snake is moving ....

結果:すべてのAnimalの実装クラスのmove()メソッドがブロックされ,説明する.
target()の取得継承関係.
3、テスト3
    
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.Animal;

public aspect MoveAspect {

	pointcut MoveAspect() :   call(* move(..)) && this(Animal);
	
	
	before() : MoveAspect(){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation());
	} 
	
}

印刷:
Snake is flying ....
Snake is moving ....

結果:メソッドはブロックされませんでした.
4、テスト4
   
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.TestMove;

public aspect MoveAspect {

	pointcut MoveAspect() :   call(* move(..)) && this(TestMove);
	
	
	before() : MoveAspect(){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation());
	} 
	
}

印刷:
Entering TestMove.java:22
Entering TestMove.java:13
Snake is flying ....
Entering TestMove.java:13
Snake is moving ....

結果:TestMoveクラスではすべてmoveが使用されなくなりました(..)方法の場所はすべて遮断された.
5、テスト5
     
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.Animal;

public aspect MoveAspect {

	pointcut MoveAspect() :   execution(* move(..)) && this(Animal);
	
	
	before() : MoveAspect(){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation());
	} 
	
}

印刷:
 
Entering Bird.java:5
Snake is flying ....
Entering Snake.java:5
Snake is moving ....

結果:Animalおよびワードサブクラスでmove()を実行するすべてのポイントがブロックされました
今まで、targetとthisの微妙な違いを感じていたのではないでしょうか.もしまだ感じていないなら、あなたが真剣に体得していないことを意味します.
6、テスト6
          
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.Animal;

public aspect MoveAspect {

	pointcut MoveAspect() :   execution(* move(..)) && within(Animal);
	
	
	before() : MoveAspect(){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation());
	} 
	
}

印刷:
 
Snake is flying ....
Snake is moving ....

結果:Animalがインタフェースであるためmove()を直接呼び出すことができないため、ブロックする方法はない.方法.
7、テスト7
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.Snake;


public aspect MoveAspect {

	pointcut MoveAspect() :   execution(* move(..)) && within(Snake);
	
	
	before() : MoveAspect(){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation());
	} 
	
}

印刷:
  
Snake is flying ....
Entering Snake.java:5
Snake is moving ....

結果:Snakeのmove()メソッドのみをブロック
8、テスト8
    
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.Animal;
import com.aspectj.demo.different.TestMove;



public aspect MoveAspect {

	pointcut MoveAspect() :   call(* move(..)) && target(Animal)&& this(TestMove);
	
	
	before() : MoveAspect(){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation());
	} 
	
}

印刷:
 
Entering TestMove.java:13
Snake is flying ....
Entering TestMove.java:13
Snake is moving ....

結果:TestMoveクラスのAnimalおよび他のサブクラスのmove()メソッド呼び出しがブロックされました.
9、テスト九
           
package com.aspectj.demo.aspect;

import com.aspectj.demo.different.Animal;
import com.aspectj.demo.different.TestMove;



public aspect MoveAspect {

	pointcut MoveAspect(Animal a,TestMove t) :   call(* move(..)) && target(a)&& this(t);
	
	
	before(Animal a,TestMove t) : MoveAspect(a,t){
		System.out.println("Entering " + thisJoinPoint.getSourceLocation() + "  target:" + a + "  this:" + t);
	} 
	
}

印刷:
Entering TestMove.java:13  target:com.aspectj.demo.different.Bird@7bde7bde  this:com.aspectj.demo.different.TestMove@52b252b2
Snake is flying ....
Entering TestMove.java:13  target:com.aspectj.demo.different.Snake@7f587f58  this:com.aspectj.demo.different.TestMove@52b252b2
Snake is moving ....

  
結果:実はこのグループはテストではありません.このグループのDemoはtarget()とthisが自分の現在のインスタンスをどのように取得するか、そして彼らがどのようにインスタンスをAdviceに伝えて使用するかを教えています.
まとめ:1枚目はapsectjが動的で静的インプラント結合していると述べた.では、Target()this()は彼の動的インプラントに属し、withinは静的インプラントである.したがってtarget()は、実行時にブロックされていることを確認する必要があります.例えばさっきの例では、Animalに実装クラスを追加し、target()でブロックすることができます.だからtarget()とthis()は継承関係の役割を果たします.つまり、signatureがベースクラスであれば、このpointcutは彼のサブクラスにも役立ちます. 
さらにtargetとthisは、対応するインスタンスを取得することができる.しかしwithinはできなかった.
target()とは、私たちのpointcutが選択したJoin pointの所有者を指し、率直に言えば、ブロックの方法がそのクラスに属していることを示します.
this()とは,我々pointcutが選択したJoin pointの呼び出しの所有者であり,すなわち,メソッドはそのクラスで呼び出される.
ps:thisの継承関係についてはテストをしていませんが、興味のある自分で作ってください.心で体得する