当前位置: 代码迷 >> ASP >> 跟小弟我学aspectj之十一 - target() this() within()的区别
  详细解决方案

跟小弟我学aspectj之十一 - target() this() within()的区别

热度:640   发布时间:2012-06-27 14:20:09.0
跟我学aspectj之十一 ----- target() this() within()的区别

keyword: target this within difference 区别

?

经过上面的一个阶段的学习,你可能已经知道了这3个关键字,而且多是用来做过滤的。你是否很迷茫:到底他们有什么区别??首先来搭建测试环境。有如下代码:


?

?


?

这就是我们的测试环境: 一个Animal接口,2个实现类Snake和Bird以及TestMove测试类。 他们都有move()方法,那么下面我将给出不同的pointcut.让你先看输出结果,请一定要用心看每个测试的pointcut的细节变化,并将代码copy(或者手动输入)到eclipse中,执行,看结果、用心去体会,很多东西我们只可意会,无法言传。然后我们再来总结:

?

1、测试一

?


打印结果如下:

?

?

?

结果: 拦截到了所有的move(..)方法调用点。

?

2、测试二

?


打印:

?

?


结果:所有Animal 的实现类的move()方法都被拦截到了,说明target()的获取继承关系

?

?

3、测试三

?


打印:

?

?


结果: 没有拦截到任何方法。

?

?

4、测试四

?


打印:

?

?


结果: 在 TestMove类里面所有掉用move(..)方法的地方都被拦截到了。

?

?

5、测试五

?


打印:

?

?


结果:所有在Animal及字子类中执行move()的点都被拦截了

?

?

?

?


到现在为止,你应该感觉出了target和this那微妙的不同同了吧?如果还没有感觉,说明你没有认真体会。


6、测试六

?

?


打印:

?

?

?

结果:无拦截到任何方法,因为Animal是接口,无法直接调用move().方法。

?

?

7、测试七

?


打印:

?

?


结果:只拦截到了Snake的move()方法

?

?


8、测试八

?

?

打印:

?


结果: 拦截到了TestMove类中Animal以及他子类的move()方法调用。

?

?

9、测试九

?

?

打印:

?


?

结果: 其实这组不算测试,这组Demo是告诉大家target()和this 怎么获取他们自己当前的实例,以及他们如何将实例传给Advice使用

?

总结: 第一张我们介绍过,说apsectj是动态、静态植入结合的。 那么Target() this()就是属于他动态植入的方式,within是静态植入的。故target(),this()需要在运行时才能确定那些被拦截。 比如刚才的例子,我们在给Animal加多一个实现类,用target() 他仍然可以被拦截。 所以target()和this()会用继承关系作用,也就是说:如果你的signature是一个基类,那么这个pointcut同时也会对他的子类也起作用。

另外target 和 this 可以获取他们对应的实例。 但是within没法作到。

?

target()是指:我们pointcut 所选取的Join point 的所有者,直白点说就是: 指明拦截的方法属于那个类。

this()是指: 我们pointcut 所选取的Join point 的调用的所有者,就是说:方法是在那个类中被调用的。

?

ps: 关于 this的继承关系没有做测试,有兴趣的自己做一个。还是那句话:用心体会

  相关解决方案