关于AspectJ 中的pointcut 语法

来源:互联网 发布:飞机 知乎 编辑:程序博客网 时间:2024/05/18 02:29

转自: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 InsufficientBalanceException:

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是在方法执行内部的开头和结尾执行你给定的方法,两者是有区别的。

原创粉丝点击