CGLIB的实现原理
下文笔者讲述CGLIB的简介说明,如下所示
CGLIB简介
CGLIB(Code Generation Library)是一个强大代码生成库 主要用于在运行时动态生成代理类 在我们日常的AOP面向切面编程时,经常使用此方式 如:Spring AOP,Spring事务
CGLIB的基本概念
CGLIB基本概念 1.动态代理: -动态代理是指在运行时动态生成代理类, 而不是在编译时生成 2.字节码操作: -CGLIB使用字节码操作库(如 ASM)来生成代理类 3.继承机制: -CGLIB通过生成目标类的子类来实现代理, 因此目标类不能是`final`
CGLIB实现原理
1.生成代理类 CGLIB通过生成目标类的子类来实现代理。 生成的代理类会重写目标类的方法, 并在这些方法中添加额外的逻辑(如拦截器) 2.使用ASM 进行字节码操作 CGLIB使用ASM库来生成和操作字节码 ASM是一个高效的字节码操作库 可以生成新的类或修改现有类 3.拦截器(MethodInterceptor) CGLIB使用`MethodInterceptor`接口来拦截方法调用 当代理类的方法被调用时 会先调用拦截器的方法 然后在拦截器中决定是否调用目标类的方法 4.代理类的创建 CGLIB生成代理类会继承目标类 并重写目标类的方法 代理类的方法会调用拦截器方法 拦截器再决定是否调用目标类方法 详细步骤 1.生成代理类: - CGLIB 通过继承目标类生成一个新的子类。 - 生成的子类会重写目标类的方法。 2.拦截器: - 定义一个 `MethodInterceptor` 接口的实现类。 - 在拦截器中实现方法调用的拦截逻辑。 3.代理类实例化: - 使用 `Enhancer` 类来创建代理类的实例。 - 设置目标类和拦截器。
例
1.添加CGLIB依赖 使用 Maven,可以在 `pom.xml` 中添加以下依赖: <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version> </dependency> 使用 Gradle 可在`build.gradle`中 添加以下依赖: dependencies { implementation 'cglib:cglib:3.3.0' } 2.定义目标类 public class TargetClass { public void sayHello() { System.out.println("Hello from TargetClass!"); } } 3.定义拦截器 import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class MyMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Before method: " + method.getName()); Object result = proxy.invokeSuper(obj, args); System.out.println("After method: " + method.getName()); return result; } } 4.创建代理类并使用 import net.sf.cglib.proxy.Enhancer; public class CglibExample { public static void main(String[] args) { // 创建 Enhancer 对象 Enhancer enhancer = new Enhancer(); // 设置目标类 enhancer.setSuperclass(TargetClass.class); // 设置拦截器 enhancer.setCallback(new MyMethodInterceptor()); // 创建代理类的实例 TargetClass proxyInstance = (TargetClass) enhancer.create(); // 调用代理类的方法 proxyInstance.sayHello(); } } ===代码详解 1.定义目标类: public class TargetClass { public void sayHello() { System.out.println("Hello from TargetClass!"); } } - `TargetClass`:目标类 包含要代理的方法 `sayHello` 2.定义拦截器: import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class MyMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Before method: " + method.getName()); Object result = proxy.invokeSuper(obj, args); System.out.println("After method: " + method.getName()); return result; } } - `MyMethodInterceptor`:实现 `MethodInterceptor` 接口。 - `intercept` 方法:在目标方法调用前后添加额外的逻辑。 3.创建代理类并使用: import net.sf.cglib.proxy.Enhancer; public class CglibExample { public static void main(String[] args) { // 创建 Enhancer 对象 Enhancer enhancer = new Enhancer(); // 设置目标类 enhancer.setSuperclass(TargetClass.class); // 设置拦截器 enhancer.setCallback(new MyMethodInterceptor()); // 创建代理类的实例 TargetClass proxyInstance = (TargetClass) enhancer.create(); // 调用代理类的方法 proxyInstance.sayHello(); } } -创建 `Enhancer`对象: `Enhancer` 是 CGLIB 的核心类, 用于生成代理类。 -设置目标类: `enhancer.setSuperclass(TargetClass.class)` 设置要代理的目标类。 -设置拦截器: `enhancer.setCallback(new MyMethodInterceptor())` 设置拦截器。 -创建代理类的实例: `enhancer.create()` 创建代理类的实例。 -调用代理类的方法: `proxyInstance.sayHello()` 调用代理类的方法, 拦截器会在方法调用前后添加额外的逻辑。 ===运行以上代码,将输出以下信息====== Before method: sayHello Hello from TargetClass! After method: sayHello
CGLIB 相关知识总结
1.生成代理类: - CGLIB 通过继承目标类生成一个新的子类。 - 生成的子类会重写目标类的方法。 2.拦截器: - 定义一个 `MethodInterceptor` 接口的实现类。 - 在拦截器中实现方法调用的拦截逻辑。 3.代理类的实例化: - 使用 `Enhancer` 类来创建代理类的实例。 - 设置目标类和拦截器。 4.方法调用: - 当代理类的方法被调用时,会先调用拦截器的方法。 - 拦截器再决定是否调用目标类的方法
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。