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.方法调用: - 当代理类的方法被调用时,会先调用拦截器的方法。 - 拦截器再决定是否调用目标类的方法
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


