文章目录
- 前言
- 概要
- SpringBoot中使用
- 小结
前言
当我们需要在Java中实现动态代理时,通常会考虑使用 JDK原生动态代理
或者 CGLIB动态代理
。
我这里说一下CGLIB动态代理,并给出一个例子。
概要
CGLIB
(Code Generation Library)是一个基于字节码生成的类库,用于在运行时动态生成类的子类。它常被用于实现基于类的动态代理。这种方式不要求被代理的类必须实现接口,因此可以代理没有实现接口的类。
CGLIB的工作原理:
- CGLIB通过生成目标类的子类来实现动态代理。
- 当需要代理一个类时,CGLIB会创建一个该类的子类,并在子类中重写需要代理的方法。
- 这允许我们在方法调用前后插入自定义逻辑,实现方法的增强。
SpringBoot中使用
第一步:导入依赖
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.1</version></dependency>
第二步:java代码实现
//被代理的类
class OriginalClass {public void doSomething() {System.out.println("原方法");}
}
核心逻辑:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class Main {public static void main(String[] args) {// Enhancer用于生成代理类 它是CGLIB库中的一个关键类Enhancer enhancer = new Enhancer();// OriginalClass被代理的类(父类)// CGLIB会生成一个OriginalClass的子类作为代理类。enhancer.setSuperclass(OriginalClass.class);// 设置拦截器 拦截器会在代理类的方法调用前后执行一些自定义逻辑//用了java的匿名内部类来创建了一个实现MethodInterceptor接口的对象enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("原方法:" + method.getName() + "执行前");Object result = methodProxy.invokeSuper(o, objects);System.out.println("原方法:" + method.getName() + "执行后");return result;}});// 创建代理对象OriginalClass proxy = (OriginalClass) enhancer.create();// 调用代理对象的方法(比原方法多一些功能)proxy.doSomething();}
}
intercept()
参数解释
o: 目标对象的实例。
method: 被调用的方法对象。
objects: 方法的参数数组。
methodProxy: 方法的代理对象,可以调用父类方法。
methodProxy.invokeSuper()作用:调用目标对象的方法(methodProxy子类的实例)
结果
小结
CGLIB动态代理在许多框架和库中都有广泛应用,它是实现AOP(面向切面编程)的重要基础之一,也是许多ORM(对象关系映射)框架的核心技术之一
有用就点个赞~~~~