私とaspectjの11---target()this()within()の違いを学びます
keyword:target this within difference区別
上の段階の学習を経て、この3つのキーワードを知っているかもしれませんが、フィルタリングに使われていることが多いです.あなたは迷っていますか:いったい彼らはどんな違いがありますか?まずテスト環境を構築します.次のコードがあります.
これが私たちのテスト環境です.1つのAnimalインタフェース、2つの実装クラスSnakeとBird、TestMoveテストクラスです.彼らはmove()の方法を持っています.では、次は異なるpointcutを提供します.まず出力結果を見てみましょう.必ずテストごとのpointcutの詳細の変化をよく見て、コードcopy(または手動入力)をeclipseに入力して、実行して、結果を見て、心を込めて体得してください.多くのものは私たちが理解することができて、伝えることができません.次にまとめます.
1、テスト1
印刷結果は次のとおりです.
結果:すべてのmoveがブロックされました(..)メソッド呼び出しポイント.
2、テスト2
印刷:
結果:すべてのAnimalの実装クラスのmove()メソッドがブロックされ,説明する.
target()の取得継承関係.
3、テスト3
印刷:
結果:メソッドはブロックされませんでした.
4、テスト4
印刷:
結果:TestMoveクラスではすべてmoveが使用されなくなりました(..)方法の場所はすべて遮断された.
5、テスト5
印刷:
結果:Animalおよびワードサブクラスでmove()を実行するすべてのポイントがブロックされました
今まで、targetとthisの微妙な違いを感じていたのではないでしょうか.もしまだ感じていないなら、あなたが真剣に体得していないことを意味します.
6、テスト6
印刷:
結果:Animalがインタフェースであるためmove()を直接呼び出すことができないため、ブロックする方法はない.方法.
7、テスト7
印刷:
結果:Snakeのmove()メソッドのみをブロック
8、テスト8
印刷:
結果:TestMoveクラスのAnimalおよび他のサブクラスのmove()メソッド呼び出しがブロックされました.
9、テスト九
印刷:
結果:実はこのグループはテストではありません.このグループの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の継承関係についてはテストをしていませんが、興味のある自分で作ってください.心で体得する
上の段階の学習を経て、この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の継承関係についてはテストをしていませんが、興味のある自分で作ってください.心で体得する