讲一下cglib底层⽤的asm
时间: 2023-08-20 14:47:35 浏览: 48
CGLIB是一个基于ASM(一个Java字节码操作库)开发的代码生成库。ASM是一个轻量级的Java字节码操作框架,它提供了一种简单的方式来动态生成或修改Java类。CGLIB利用ASM的功能来操作字节码,实现动态生成Java类的功能。在CGLIB中,ASM被用来创建和编辑代理类的字节码,以及定义代理类中的方法和属性。
ASM使用一种类似于访问者模式的方式来遍历字节码,并提供了一些API来访问字节码中的各种元素,如类、方法、字段、注解等。CGLIB通过使用ASM提供的API来创建和编辑代理类的字节码,以及定义代理类中的方法和属性。在CGLIB中,ASM被包装在一个更高级别的API之下,使得使用起来更加简单和方便。
总的来说,CGLIB底层使用的ASM,是一个非常强大的Java字节码操作库,它提供了一种简单的方式来生成或修改Java类的字节码。在CGLIB中,ASM被用来创建和编辑代理类的字节码,以及定义代理类中的方法和属性,从而实现了动态生成Java类的功能。
相关问题
为什么JDK动态代理要实现接⼝,CGLIB不⽤实现
JDK 动态代理和 CGLIB 都是 Java 中常用的动态代理技术,它们的实现方式不同。JDK 动态代理要求被代理对象实现接口,而 CGLIB 则不需要被代理对象实现接口。
JDK 动态代理是基于接口实现的,通过 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口实现。在运行时,JDK 动态代理会在内存中生成一个代理类,该代理类实现了被代理接口,并将方法的调用转发到 `InvocationHandler` 接口的实现类中。由于 Java 只支持单继承,因此 JDK 动态代理只能代理实现了接口的类。
CGLIB 则是基于继承实现的,通过继承被代理类并重写其方法来实现代理。在运行时,CGLIB 会在内存中动态生成一个被代理类的子类,该子类重写了被代理类的方法,并将方法的调用转发到代理类的方法中。由于 CGLIB 通过生成子类来实现代理,因此不需要被代理类实现接口。
总的来说,JDK 动态代理和 CGLIB 都有各自的优缺点。JDK 动态代理可以代理接口,因此更加灵活,但只能代理实现了接口的类。CGLIB 可以代理没有实现接口的类,但在生成代理类时需要消耗更多的资源。因此,在实际应用中,需要根据具体的场景选择合适的动态代理技术。
jdk和cglib的底层实现原理
JDK动态代理和CGLIB动态代理是实现AOP的两种常用方式,它们的底层实现原理有所不同。
1. JDK动态代理:
JDK动态代理是基于Java的反射机制实现的。当使用JDK动态代理时,Java的Proxy类和InvocationHandler接口被用于创建代理对象。代理对象在运行时实现了目标接口,并将方法调用重定向到InvocationHandler的invoke()方法。在invoke()方法中,可以根据需要执行额外的逻辑,然后再调用目标对象的方法。这种方式只能代理接口,无法代理类。
2. CGLIB动态代理:
CGLIB动态代理是使用字节码操作库来生成目标对象的子类,并重写目标方法实现的。CGLIB基于ASM(一个Java字节码操纵框架)来操作字节码。当使用CGLIB动态代理时,CGLIB会在运行时生成目标对象的子类,并将额外的逻辑织入到子类中的方法中。通过继承目标类,CGLIB能够覆盖目标类中的非final方法,并在子类中添加切面逻辑。因此,CGLIB可以代理普通类而不仅限于接口。
总结来说,JDK动态代理是基于接口的代理,使用Java的反射机制来实现;而CGLIB动态代理是基于类的代理,通过生成目标对象的子类来实现。选择使用哪种方式取决于具体的需求,如是否需要代理类而不仅限于接口、性能要求等。