专业的编程技术博客社区

网站首页 > 博客文章 正文

CGLIB(CGlib动态代理和JDK动态代理)

baijin 2024-09-04 02:02:43 博客文章 9 ℃ 0 评论

CGLIB(Code Generation Library)是在运行时动态生成和操作 Java 字节码的。这是 CGLIB 的一个关键特性,使得它能够在程序执行过程中动态创建类和对象。以下是一些重要的解释:

1. 运行时生成

CGLIB 在程序运行时生成字节码,而不是在编译时。这意味着:

- 代理类的创建发生在应用程序执行期间。

- 不需要在编译时知道要代理的类,可以根据运行时的需求动态决定。

2. 动态性

- CGLIB 可以根据程序的实际运行情况动态地生成和修改类。

- 这种动态性使得 CGLIB 能够适应运行时的变化,比如根据配置或者运行环境动态地决定如何创建代理。

3. 字节码操作

- CGLIB 直接操作 Java 字节码,而不是源代码。

- 它使用 ASM 库来生成和转换字节码,这个过程完全发生在 JVM 内部。

4. 类加载

- 生成的字节码会被动态地加载到 JVM 中,成为可以使用的 Java 类。

- 这个过程使用自定义的 ClassLoader 来完成。

5. 实时性

- 代理类的创建和使用可以在同一个 JVM 会话中完成。

- 不需要重启应用程序或重新编译代码。

6. 性能考虑

- 由于字节码生成发生在运行时,首次创建代理对象可能会有一定的性能开销。

- CGLIB 使用缓存机制来存储已生成的代理类,以提高后续创建相同类型代理对象的性能。

7. 灵活性

- 运行时生成使得 CGLIB 非常灵活,可以根据程序的实际需求动态地创建代理。

- 这种灵活性在某些场景下(如 ORM 框架、AOP 实现)非常有用。

示例说明:

```java

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 CGLibExample {

public static void main(String[] args) {

Enhancer enhancer = new Enhancer();

enhancer.setSuperclass(TargetClass.class);

enhancer.setCallback(new MyInterceptor());

TargetClass proxy = (TargetClass) enhancer.create();

proxy.targetMethod();

}

}

class TargetClass {

public void targetMethod() {

System.out.println("Target method called");

}

}

class MyInterceptor implements MethodInterceptor {

@Override

public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

System.out.println("Before method call");

Object result = proxy.invokeSuper(obj, args);

System.out.println("After method call");

return result;

}

}

```

在这个例子中:

1. 代理类的创建和使用都发生在 `main` 方法执行时,即运行时。

2. `Enhancer.create()` 方法调用时,CGLIB 才开始生成字节码并创建代理类。

3. 生成的代理类直接在内存中创建,无需编译阶段的参与。

总之,CGLIB 的动态代理完全是一个运行时的过程,这使得它非常强大和灵活,能够适应各种复杂的动态代理需求。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表