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

相关推荐

  • Linux常用命令:chmod修改文件权限 777和754

    Linux常用命令:chmod修改文件权限 777和754常用下面这条命令:chmod777 文件或目录示例:chmod 777/etc/squid运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行)。如果是Ubuntu系统,可能需要加上sudo来执行:sudochmod 777/etc/squid故事的开始,都会先留一个悬念。只有程序员能懂的冷笑话系列中,有个比较经典的段子:请用最简洁的语言描述我国FL。754。…

    2022年7月27日
  • 悲观锁和乐观锁的使用[通俗易懂]

    悲观锁和乐观锁的使用[通俗易懂]1、悲观锁(PessimisticLock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。最常用的就是select..forupdate,它是一种行锁,会把select出来的结果行锁住,在本

    2022年8月23日
  • creo每次都要配置config_config怎么打开

    creo每次都要配置config_config怎么打开前言每个测试用例都应该有config部分,可以配置用例级别。比如name、base_url、variables、verify、export等等案例演示fromhttprunnerimport

    2022年8月6日
  • qt录制屏幕_iphone录屏转gif

    qt录制屏幕_iphone录屏转gif一、说明:不断地截取选中的区域,然后将其制作成gif动图。二、效果图:1、可设置要录制屏幕的宽高,支持右下角直接拉动改变.2、可设置变宽的宽度3、可设置录屏控件的背景颜色4、可设置录制的帧数5、录制区域可自由拖动选择三、代码:1、main.cpp#pragmaexecution_character_set(“utf-8”)#include”gifwidget.h”#include<QApplication>#include<QTe

    2022年9月20日
  • Modbus通讯协议详细解释

    Modbus通讯协议详细解释Modbus一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。先来简单分析一条MODBUS-RTU报文,例如:0106000100179804010600010017

    2022年7月12日
  • python注入_Python——dll注入

    python注入_Python——dll注入dll攻击原理分析什么是dll动态链接库,是在微软Windows操作系统中实现共享函数库概念的一种方式。这些库函数的扩展名是”.dll”、”.ocx”(包含ActiveX控制的库)或者”.drv”(旧式的系统驱动程序)。为何有dll由于进程的地址空间是独立的(保护模式),当多个进程共享相同的库时,每个库都在硬盘和进程彼此的内存存放一份的话,对于早期的计算机来说,无疑是一种极大的浪费,于是win…

    2022年5月17日

发表回复

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

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