methodinterceptor 是 cglib 动态代理核心接口,用于在目标方法执行前后插入自定义逻辑;它通过 intercept 方法接收代理对象、原方法、参数及 methodproxy,推荐用 proxy.invokesuper() 调用父类方法以避免递归。

MethodInterceptor 是 CGLIB 动态代理的核心接口,用于在目标方法执行前后插入自定义逻辑(即“拦截”)。它类似于 JDK 动态代理中的 InvocationHandler,但专为基于类的代理设计(CGLIB 通过子类继承方式实现代理,不依赖接口)。
MethodInterceptor 接口定义与关键参数
该接口只有一个抽象方法:
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable
四个参数含义如下:
- obj:代理对象(即 CGLIB 创建的子类实例)
- method:被拦截的原始方法(来自父类)
- args:调用时传入的参数数组
-
proxy:CGLIB 生成的方法代理对象,用于高效调用父类方法(推荐用它代替
method.invoke())
实现一个基础的 MethodInterceptor
只需实现接口并重写 intercept 方法。常见模式是:前置处理 → 调用原方法 → 后置处理 → 返回结果。
public class LoggingInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("【前置】即将执行: " + method.getName());
// 使用 proxy.invokeSuper() 调用父类(被代理类)的实际方法(高效且避免无限递归)
Object result = proxy.invokeSuper(obj, args);
System.out.println("【后置】执行完成,返回值: " + result);
return result;
}
}
注意:proxy.invokeSuper() 是关键——它绕过当前代理逻辑,直接调用父类方法;若误用 method.invoke(obj, args),可能触发再次拦截,导致栈溢出。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
使用 Enhancer 创建代理对象
CGLIB 通过 Enhancer 类生成代理子类。需指定被代理类、设置回调(即 MethodInterceptor 实例):
Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(YourTargetClass.class); // 必须是非 final 类 enhancer.setCallback(new LoggingInterceptor()); // 设置拦截器 YourTargetClass proxy = (YourTargetClass) enhancer.create(); proxy.someMethod(); // 触发拦截逻辑
补充说明:
- 被代理类不能是
final(否则无法继承) - 被代理方法也不能是
final或static(无法被子类覆盖) - 若需对不同方法区别处理,可在
intercept中用method.getName()或注解判断
进阶技巧:多个回调与 CallbackFilter
一个代理可配置多个 Callback(如 MethodInterceptor、NoOp、FixedValue),配合 CallbackFilter 控制哪个方法走哪个回调:
enhancer.setCallbacks(new Callback[]{new LoggingInterceptor(), NoOp.INSTANCE});
enhancer.setCallbackFilter(new CallbackFilter() {
@Override
public int accept(Method method) {
return "doSomething".equals(method.getName()) ? 0 : 1; // doSomething 走拦截器,其余走 NoOp
}
});
这种方式适合细粒度控制,比如只对特定方法增强日志或事务,其他方法保持原行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










