做天然文化石的网站,集团官网建设公司,深圳博大建设,成都网站建设报价表1.介绍
cglib (Code Generation Library ) 是一个第三方代码生成类库#xff0c;运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。cglib 为没有实现接口的类提供代理#xff0c;为JDK的动态代理提供了很好的补充。
2.JDK动态代理与CGLIB动态代理对比 JDK…1.介绍
cglib (Code Generation Library ) 是一个第三方代码生成类库运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。cglib 为没有实现接口的类提供代理为JDK的动态代理提供了很好的补充。
2.JDK动态代理与CGLIB动态代理对比 JDK动态代理 只能代理实现了接口的类。基于接口的代理通过反射机制来实现在运行时创建接口的匿名类。代码简洁原生支持Java。 CGLIB动态代理 可以代理没有实现接口的类。基于继承的代理通过生成目标类的子类来实现代理。性能更高但生成的代理类可能比较复杂。
3. CGLIB的使用场景 代理类的生成原理 CGLIB通过修改字节码生成目标类的子类来实现代理利用了ASM一个Java字节码操作框架来动态生成新的类。 实现原理示例 展示如何使用CGLIB生成一个简单的代理类并解释其生成的字节码结构。
4. 代码示例
演示如何使用CGLIB创建代理对象 创建一个普通的Java类然后使用CGLIB生成它的代理对象并调用代理对象的方法
public class TargetClass {public void doSomething() {System.out.println(Target method doing something.);}
}public class ProxyInterceptor implements MethodInterceptor {Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(Before invoking method: method.getName());Object result proxy.invokeSuper(obj, args);System.out.println(After invoking method: method.getName());return result;}
}public class CglibDynamicProxyExample {public static void main(String[] args) {Enhancer enhancer new Enhancer();enhancer.setSuperclass(TargetClass.class);enhancer.setCallback(new ProxyInterceptor());TargetClass proxy (TargetClass) enhancer.create();proxy.doSomething();}
}示例解析 TargetClass 是被代理的普通类。ProxyInterceptor 实现了 CGLIB 的 MethodInterceptor 接口定义了代理对象的行为在方法调用前后可以执行自定义的逻辑。CglibDynamicProxyExample 中使用 Enhancer 类创建代理对象并指定代理对象的超类即被代理类以及使用的拦截器。
5. 总结
优缺点对比 CGLIB动态代理性能更高支持代理非接口类但生成的代理类可能复杂。JDK动态代理简单易用只能代理接口生成的代理类结构简单。