基本概念
若想要在通知方法获取被通知方法的参数共有两种方式:自动获取、手动指定。下面来探究下这两种方式的不同之处。
自动获取参数
在介绍 AOP 的通知类型时有提到过环绕通知,该通知类型可以通过参数 ProceedingJoinPoint 自动获取被通知方法的参数值并调用该方法。除了 ProceedingJoinPoint 外,还有 JoinPoint,JoinPoint.StaticPart 也都能自动获取被通知方法的参数。
1.JoinPoint
JoinPoint 即连接点,通过该参数可以获取连接点(被通知方法)的相关信息。
首先来看该接口的继承关系,如下图。可以发现在环绕通知中所使用的 ProceedingJoinPoint 就是继承自该接口。
再来看看该接口的定义:
public interface JoinPoint {
// 连接点的具体信息
String toString();
// 连接点的简单信息
String toShortString();
// 连接点的所有信息
String toLongString();
// AOP 代理对象
Object getThis();
// 目标对象
Object getTarget();
// 被通知方法的参数列表
Object[] getArgs();
// 连接点签名
Signature getSignature();
// 连接点方法所在类文件中的位置
SourceLocation getSourceLocation();
// 连接点类型
String getKind();
// 内部接口,暂不探究(下面会提到)
public interface StaticPart {
//... 省略部分代码
}
public interface EnclosingStaticPart extends StaticPart {
}
// 返回连接点静态部分
StaticPart getStaticPart();
// getKind 方法的返回值
static String METHOD_EXECUTION = "method-execution";
static String METHOD_CALL = "method-call";
static String CONSTRUCTOR_EXECUTION = "constructor-execution";
static String CONSTRUCTOR_CALL = "constructor-call";