转自:http://blog.sina.com.cn/s/blog_6a0e23b90100s485.html
pointcut,切点,辨认切点执行自己指定的动作
基础的解说如下:
public pointcut accountOperations:call(* Account.*(..))
1.通配符和pointcut 操纵符
* 表现任何数目的字符,除了(.)
.. 表现任何数质的字符包括任何数目的(.)
+ 描写指订类型的任何子类或许子交心
一元操纵符:!
两元操做符:||和&&
优先权同java
2.签实语法
范例署名样式
重要的例子:
Account 类型Account
*Account 利用Account称号停止的类型,如SavingsAccount和CheckingAccount
java.*.Date 范例Date正在任何直交的java子包中,如java.util.Date和java.sql.Date
java..* 任安在java包或者所有子包中的类型,如java.awt和java.util或者java.awt.event 和java.util.logging
javax..*Model+ 所有javax包或者子包中以Model末端的类型和其所有子类,如TableModel,TreeModel。
!vector 一切除了Vector的范例
Vector|| Hashtable Vector或者Hashtable类型
java.util.RandomAccess+ 完成RandomAccess和List的所有子类
&& java.util.List+
----------------------------------------
方式和结构器署名模式
public void Collection.clear():
在Collection中同样签实的clear方法
public void Account.debit(float) throws InsufficientBalanceExcep
Account中同样署名的debit方法
public void Account.set*(*)
Account中以set扫尾,而且只要一个参数类型的方法
public void Account.*()
Account中所有的出有参数的public void 法子
public * Account.*()
Account中所有出有参数的public 方法
public * Account.*(..)
Account中所有的public 方法
* Account.*(..)
Account中的一切办法,包含private方式
!public * Account.*(..)
所有的非public 办法
* Account+.*(..)
所有的方法,包括子类的方法
* java.io.Reader.read(..)
所有的read方法
* java.io.Reader.read(char[],..)
一切以read(char[])开端的方式,包含read(char[])和read(char[],int,400电话http://www.lwkx.com/,int)
* javax..*.add*Listener(EventListener+)
定名以add开端,以Listener末端的法子,参数中为EventListener或者子类
* *.*(..) throws RemoteException
扔出RemoteException的所有方法
构造器,同上里
public Account.new()
出有参数的构制器法子
------------------------
属性签实模式
* Account.*
所有的Account属性
!public static * banking..*.*
所有的非public static 属性,正在banking的包或许子包中
3.重要的pointcuts类型
分类pointcuts
遵照特定的语法用于捕捉每一个品种的可利用连接点。
主要的品种:
方法执行:execution(MethodSignature)
办法调用:call(MethodSignature)
结构器施行:execution(ConstructorSignature)
构制器挪用:call(ConstructorSignature)
类始初化:staticinitialization(TypeSignature)
属性读操作:get(FieldSignature)
属性写操纵:set(FieldSignature)
破例处置施行:handler(TypeSignature)
工具始初化:initialization(ConstructorSignature)
工具事后始初化:preinitialization(ConstructorSignature)
Advice执行:adviceexecution()
基于节制淌的pointcuts
重要包括两品种型的节制淌:
cflow(Pointcut),捕捉所有的衔接点在指订的方法执止中,包含执行方法自身。
cflowbelow(Pointcut),捕捉所有的连接点在指订的方法执行中,除了执行方法自身。
如以下的例子:
cflow(call(* Account.debit(..))
所有的debit方法中的连接点,包括debit方法自身
cflowbelow(call(* Account.debit(..))
所有debit方法中的连接点,除了debit方法原身
cflow(transactedOperations())
所有由transactedOperations捕捉的连接点
cflowbelow(execution(Account.new(..))
所有正在Account 结构器中施行的衔接面
基于词汇构造的连接点
流代码片段,如within()和withincode()
within :捕捉在指定类或者方面中的步伐体中的所有连接点,包括内部类。
Withincode:用于捕捉在构制器或者者方法中的所有连交点,包括在此中的外地类
执行对象连接点
this,和target做为方法被挪用的对象。
this(Account),所有Account的执行点,匹配所有的连接点,如方法调用,属性设放,以后的执行对于象为Account,或者其子类。
target(Account):所有的衔接面,目的工具为Account或者其子类。
在within()和this()中的区别:
一个是步伐体,而另一个为对象执行。
参数pointcuts
用于捕捉参数类型的连接点。
args(String,..,int)
args(RemoteException)
前提检测pointcuts
if(System.currentTimeMillis()>triggerTime)
AspectJ5 已经增添了没有少语法,主要闭于Annotation 的别样视角的具有也说明了为什么作者须要编纂,而运发动需求锻练的缘由。
后面的内容很拗口,估计是翻译过来的,前面的基本内容还是很有帮助的。
自己的心得:
call是在方法执行前后调用你给定的方法
execution是在方法执行内部的开头和结尾执行你给定的方法,两者是有区别的。