AOP AspectJ Pointcuts 表达式 语法 示例

AOP AspectJ Pointcuts 表达式 语法 示例

Pointcut语法格式

Pointcut 是指那些方法需要被执行”AOP”,是由”Pointcut Expression”来描述的。

Pointcut可以由下列方式来定义或者通过 && || 和 ! 的方式进行组合。

args()
@args()
execution()
this()
target()
@target()
within()
@within()
@annotation
9

9

 

1

args()

2

@args()

3

execution()

4

this()

5

target()

6

@target()

7

within()

8

@within()

9

@annotation

其中 execution 是用的最多的,其格式为:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
execution(修饰符? 返回值的类型 所属的类? 方法名(参数列表) 抛出的异常?)
 

1

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

2

execution(修饰符? 返回值的类型 所属的类? 方法名(参数列表) 抛出的异常?)

后面带 ? 的表示可以省略,returning type pattern 和 name pattern 和 parameters pattern是必须的。

  • modifiers-pattern:指定方法的修饰符,支持通配符,该部分可以省略
  • ret-type-pattern:指定方法的返回值类型,支持通配符,可以使用 * 通配符来匹配所有的返回值类型
  • declaring-type-pattern:指定方法所属的类,支持通配符,该部分可以省略
  • name-pattern:指定匹配指定的方法名,支持通配符,可以使用 * 通配符来匹配所有方法,也可以用 set* 匹配以 set 开头的所有方法
  • param-pattern:指定方法声明中的形参列表,支持两个通配符,即 * 和 .. ,其中 * 代表一个任意类型的参数,而 .. 代表零个或多个任意类型的参数。例如 :
    () 匹配一个不接受任何参数的方法
    (..) 匹配一个接受任意数量参数的方法
    (*) 匹配了一个接受一个任何类型的参数的方法
    (*,String) 匹配了一个接受两个参数的方法,其中第一个参数是任意类型,第二个参数必须是String类型
  • throws-pattern:指定方法声明抛出的异常,支持通配符,该部分可以省略

通配符和操作符

* 表示任何数量的字符,除了(.)

.. 表示任何数量的字符包括任何数量的(.)

+ 描述指定类型的任何子类或者子接口

同java一样,提供了一元和二元的条件表达操作符。

一元操作符:!

二元操作符:||和&&

优先权同java


案例1

类型签名样式

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 Account.debit(float) throws InsufficientBalanceException
x

 

1

public void Account.debit(float) throws InsufficientBalanceException

Account中以set开头,并且只有一个参数类型的方法
public void Account.set*(*)
1

1

 

1

public void Account.set*(*)

Account中所有的没有参数的public void 方法

public void Account.*()
1

1

 

1

public void Account.*()

Account中所有没有参数的public 方法

public * Account.*()
1

1

 

1

public * Account.*()

Account中所有的public 方法

public * Account.*(..)
1

1

 

1

public * Account.*(..)

Account中的所有方法,包括private方法

* Account.*(..)
1

1

 

1

* Account.*(..)

Account中的所有的非public 方法

!public * Account.*(..)
1

1

 

1

!public * Account.*(..)

Account中的所有的方法,包括子类的方法

* Account+.*(..)
1

1

 

1

* Account+.*(..)

所有的read方法

* java.io.Reader.read(..)
1

1

 

1

* java.io.Reader.read(..)

所有以read(char[])开始的方法,包括read(char[])和read(char[],int,int)

* java.io.Reader.read(char[],..)
1

1

 

1

* java.io.Reader.read(char[],..)

命名以add开始,以Listener结尾的方法,参数中为EventListener或子类

* javax..*.add*Listener(EventListener+)
1

1

 

1

* javax..*.add*Listener(EventListener+)

抛出RemoteException的所有方法

* *.*(..) throws RemoteException
1

1

 

1

* *.*(..) throws RemoteException


构造器签名模式

同上面,
没有参数的构造器方法

public Account.new()
1

1

 

1

public Account.new()


属性签名模式

同方法一样,属性也查不多
所有的Account属性

* Account.*  
1

1

 

1

* Account.*  

所有的非public static 属性,在banking的包或者子包中

!public static * banking..*.*
1

1

 

1

!public static * banking..*.*


案例2

任意公共方法的执行:

execution(public * *(..))
1

1

 

1

execution(public * *(..))

任何一个以 set 开始的方法的执行:

execution(* set*(..))
1

1

 

1

execution(* set*(..))

接口
com.xyz.service.
AccountService 中的任意方法的执行:

execution(* com.xyz.service.AccountService.*(..))
1

1

 

1

execution(* com.xyz.service.AccountService.*(..))

定义在 com.xyz.service 包里的任意方法的执行:

execution(* com.xyz.service.*.*(..))
1

1

 

1

execution(* com.xyz.service.*.*(..))

定义在 com.xyz.service 包和所有子包里的任意类的任意方法的执行:

execution(* com.xyz.service..*.*(..))
1

1

 

1

execution(* com.xyz.service..*.*(..))

定义在 com.xyz.pointcutexp 包和所有子包里的 JoinPointObjP2 类的任意方法的执行:

execution(* com.xyz.pointcutexp..JoinPointObjP2.*(..))")
1

1

 

1

execution(* com.xyz.pointcutexp..JoinPointObjP2.*(..))")


2018-4-27
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101696.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • httprunner(8)用例调用-RunTestCase[通俗易懂]

    httprunner(8)用例调用-RunTestCase[通俗易懂]前言一般我们写接口自动化的时候,遇到复杂的逻辑,都会调用API方法来满足前置条件,Pytest的特性是无法用例之间相互调动的,我们一般只调用自己封装的API方法。而httprunner支持用例之间

    2022年7月28日
    11
  • 一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD「建议收藏」

    一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD「建议收藏」一文读懂目标检测:R-CNN、FastR-CNN、FasterR-CNN、YOLO、SSD前言之前我所在的公司七月在线开设的深度学习等一系列课程经常会讲目标检测,包括R-CNN、FastR-CNN、FasterR-CNN,但一直没有比较好的机会深入(但当你对目标检测有个基本的了解之后,再看这些课程你会收益很大)。但目标检测这个领域实在是太火了,经常会看到一些写的不…

    2022年6月11日
    27
  • Highways「建议收藏」

    Highways「建议收藏」HighwaysTimeLimit:1000MS MemoryLimit:10000KTotalSubmissions:14613 Accepted:4211 SpecialJudgeDescriptionTheislandnationofFlatopiaisperfectlyflat.

    2022年4月26日
    38
  • 安捷伦(Agilent)示波器使用简介

    安捷伦(Agilent)示波器使用简介安捷伦示波器使用简介

    2022年10月12日
    0
  • 倾向得分匹配结果(倾向得分匹配后怎么进行回归)

    原标题:手把手教你做倾向评分匹配-PSM本文首发于“百味科研芝士”微信公众号,转载请注明:百味科研芝士,Focus科研人的百味需求。各位科研芝士的朋友大家好,今天和大家分享一下新的知识点—PSM,或许大家早已听过这个名词了,或许你对它还是半知半解,不过没关系,希望可以通过今天的帖子帮助你对该名词有一定的理解。PSMPSM英文全称为PropensityScoreMatching,意思是倾向匹配…

    2022年4月12日
    96
  • JS后退, JS返回上一页, JS返回下一页

    JS后退, JS返回上一页, JS返回下一页
    Javascript返回上一页:
    1. history.go(-1),返回两个页面:history.go(-2);
    2. history.back(). 
    3. window.history.forward()返回下一页
    4. window.history.go(返回第几页,也可以使用访问过的URL)  
     例:
    向上一页 
    respons

    2022年7月25日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号