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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • NVIC的使用[通俗易懂]

    NVIC的使用[通俗易懂]NVIC相关内容中断编程的四个部分——1.使能中断请求;2.配置中断优先级分组(一个项目中只需要配置一次)3.配置NVIC寄存器,初始化NVIC_InitTypeDef;4.编写中断服务函数。中断过程的三个部分——1.配置NVIC_Config()函数:NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。因此控制中断的进行与NVIC_Config函数的配置密切相关。2.配置EXTI_Config()函数:3.编写中断服务函数:…

    2022年5月27日
    56
  • DVWA安装教程(Linux)[通俗易懂]

    DVWA安装教程(Linux)[通俗易懂]安装环境:kali-Linux虚拟机。下载好DVWA和XAMPP安装包之后,就可以开始安装了。第一步,安装XAMPP(注意下载适合系统的XAMPP,不要下载成别的操作系统的),安装后服务全部start。可以顺便在浏览器试试输入127.0.0.1,正确的话会出现xampp相关网页。第二步,把dvwa.zip文件解压至lampp文件夹下htdocs文件夹中,名字改为dvwa,方便后续操作。第三…

    2025年8月6日
    1
  • 使用rpm安装telnet软件并实现远程登录

    使用rpm安装telnet软件并实现远程登录一、RPM包管理工具的使用1、RPM包管理工具介绍·RedHat软件包管理工具(RedHatPackageManager,RPM)·RPM软件包工具常用于软件包的安装、查询、更新升级、校验、卸载以及生成.rpm格式的软件包等操作。·RPM软件包工具只能管理后缀是.rpm的软件包。软件包的命名格式:·软件名称-版本号(包括主版本号和次版本号).软件运行的硬件平台.rpm例:telnet-server-0.17-59.el7.x86_64.rpm。2、RPM工具的使用RPM

    2022年5月9日
    46
  • linux keypad driver

    linux keypad driverDTS文件、driver文件

    2022年5月1日
    61
  • md5加密算法是可逆的_md5为什么不可逆

    md5加密算法是可逆的_md5为什么不可逆md5加密以上代码输出结果:注:md5算法是不可逆的,所以经过md5加密过的字符串是无法还原(解密)的。一般用作登陆验证的时候,也是要先经过md5加密然后去数据库验证密码是否正确。据说md5是被

    2022年8月3日
    4
  • python导入excel数据画散点图_excel折线图怎么做一条线

    python导入excel数据画散点图_excel折线图怎么做一条线目的:读取excel文件中的数据,绘制折线图、散点图安装环境:由于我使用的是Anaconda集成的环境所以不用安装模块,直接导入就行importpandasaspdimportmatplotlib.pyplotasplt绘制简单折线pandas操作Excel表单数据准备,有一个Excel文件:lemon.xlsx有两个表单,表单名分别为:Python以及student,Python的表单数据如下所示:student的表单数据如下所示:…

    2022年9月26日
    2

发表回复

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

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