$instanceof{org.acme.SomeInterface}
$instanceof{@org.acme.SomeAnnotation}
$instanceof{org.acme.interfaces.*}
对于更复杂的类型表达式,可以使用Typedef。
$typedef{id}
public void org.acme.SomeClass->methodName(java.lang.String)
方法的属性(public,static,private)是可选的,如果属性缺省,任何属性都会被假定。属性能接受!修饰符作为否定。
public !static void org.acme.SomeClass->*(..)
$instanceof{}可以用来取代类名。
void $instanceof{org.acme.SomeInterface}->methodName(java.lang.String)
挑选包org.acme中所有类的toString()方法:
java.lang.String org.acme..->toString()
匹配给定接口方法使用$implements{}或$implementing{}替换方法名称。
void @javax.ejb.Entity->methodName(java.lang.String)
annotation可以被用来替换方法名称,必须标记为@javax.ejb.Tx
* *->@javax.ejb.Tx(..)
此外,可以使用typedefs,$instanceof{},annotation和通配符来匹配方法参数和返回类型。下例
@javax.ejb.Entity *->loadEntity($instanceof{@org.acme.Ann},java.*.String)
匹配方法:返回类型标为@javax.ejb.Entity,接收参数为标记为@org.acme.Ann和匹配java.*.String。
public void org.acme.SomeClass->methodName(java.lang.String)throws org.acme.SomeException, java.lang.Exception
如果任何异常出现在pointcut表达式中,他们必须春现在匹配的方法中。
public org.acme.SomeClass->new(java.lang.String)
!public org.acme.SomeClass->new(..)//属性接收!修饰符。
$instanceof{org.acme.SomeInterface}->new(..)//$instanceof{}用于className
org.acme..->new()//挑选包org.acme内的所有无参构造器的类。
@javax.ejb.Entity->new(..)//挑选标记为@javax.ejb.Entity类的构造器
*->@javax.ejb.MethodPermission(..)//替换new关键词,匹配被标记为@javax.ejb.MethodPermission的构造器
*->new(@org.acme.Ann, java.*.String)//标记和通配符来替代参数
public void org.acme.SomeClass->new(java.lang.String) throws org.acme.SomeException, java.lang.Exception//可以包含异常
public java.lang.String org.acme.SomeClass->fieldname//标准表达式
!public java.lang.String org.acme.SomeClass->*//否定修饰符
* $instanceof{org.acme.SomeInterface}->*//使用$instanceof替换类
* @javax.ejb.Entity->*//使用@javax.ejb.Entity替换类,凡是被标记的类都将被匹配到
* *->@org.jboss.Injected//@org.jboss.Injected替换field名
除此之外,可以使用typedef,$instanceof{},annotation和通配符来修饰field类型。例如
@javax.ejb.Entity *->*
execution(method or constructor)//拦截方法或构造器
execution(public void Foo->method()
execution(public Foo->new())
/**指定aspect在构造器内执行
execution要求调用new()的代码必须被编译器拦截。construction则要求aspects被植入在构造器所有代码后
*/
construction(constructor)
construction(public Foo->new())
/**get指定当field被读操作访问时,被拦截器*/
get (field expression)
get(public int Foo->fieldname)
/**set指定当field被写操作访问时,被拦截器*/
set(field expression)
set(public int Foo->fieldname)
/**field指定当field被读或写操作访问时,被拦截器*/
field(field expression)
field(public int Foo->fieldname)
/**指定某个类的任何构造器、方法、field被拦截,如果使用annotation,则匹配成员的annotation*/
all(type expression)
all(org.acme.SomeClass)
all(@org.jboss.security.Permission)
/**call用来指定拦截的任何构造器或方法,它不同与execution,它发生在调用者这边,且调用者信息对Invocation来说可见*/
call(method or constructor)
call(public void Foo->method()
call(public Foo->new())
/**within匹配任何在特定类型代码之内的joinpoint(method或constructor调用)*/
within(type expression)
within(org.acme.SomeClass)
within(@org.jboss.security.Permission)
/**withincode匹配特定method或constructor内的任何joinpoint**/
withincode(method or constructor)
withincode(public void Foo->method()
withincode(public Foo->new())
/**has是匹配的额外要求,如果joinpoint匹配到了,它的class必须有一个constructor或method满足has表达式*/
has(method or constructor)
has(void *->@org.jboss.security.Permission(..))
has(*->new(java.lang.String))
/**如果joinpoint被匹配,它的class必须有一个constructor或method满足hasfield表达式**/
hasfield(field expression)
hasfield(* *->@org.jboss.security.Permission)
hasfield(public java.lang.String *->*)
call(void Foo->someMethod()) AND withincode(void Bar->caller())
execution(* *->@SomeAnnotation(..)) OR field(* *->@SomeAnnotation)