Invocation对象封装被拦截方法上下文,可通过getTarget()获取目标对象(如Executor),getMethod()获取被拦截Method,getArgs()获取参数数组,三者配合可安全读取或谨慎修改SQL执行前的参数等关键数据。

在 MyBatis 插件(Interceptor)中,Invocation 对象封装了被拦截方法的调用上下文,可通过它安全获取目标对象(target)和被调用的方法(method)。
获取目标对象(target)
Invocation 提供了 getTarget() 方法,直接返回被代理的真实对象(如 Executor、StatementHandler 等)。注意:该对象可能是 MyBatis 内部组件的代理实例(如 JDK 动态代理或 CGLIB 代理),但仍是运行时实际执行逻辑的目标主体。
- 常见 target 类型包括:
Executor、ParameterHandler、ResultSetHandler、StatementHandler - 可安全做强制类型转换,例如:
Executor executor = (Executor) invocation.getTarget(); - 不建议对 target 做修改或替换,除非明确了解 MyBatis 内部生命周期与线程安全性
获取被调用的方法(method)
调用 invocation.getMethod() 即可获得当前被拦截的 Method 对象。它代表插件所拦截的那个具体方法(如 Executor.update(...) 或 StatementHandler.prepare(...))。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可用于判断是否为预期方法:
"prepare".equals(method.getName()) - 可读取方法签名:
method.getReturnType()、method.getParameterTypes() - 配合
invocation.getArgs()可分析入参,例如获取 SQL 参数或 Statement 对象
获取方法参数(args)
invocation.getArgs() 返回 Object[],即原方法调用时传入的所有参数。结合 method 可精准定位关键数据:
立即学习“Java免费学习笔记(深入)”;
- 对
StatementHandler.prepare(Connection, Integer),args[0]是Connection - 对
Executor.query(MappedStatement, Object, RowBounds, ResultHandler),args[1]是用户传入的 parameter - 参数数组可修改(需谨慎),修改后会传递给后续调用链
典型使用示例
比如想在 SQL 执行前记录参数:
public Object intercept(Invocation invocation) throws Throwable {
Object target = invocation.getTarget();
Method method = invocation.getMethod();
Object[] args = invocation.getArgs();
if ("query".equals(method.getName()) && target instanceof Executor) {
Object param = args.length > 1 ? args[1] : null;
log.info("Executing query with param: {}", param);
}
return invocation.proceed(); // 继续执行原逻辑
}

















