CGLIB 介绍
CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库。
CGLib 可以在运行时扩展Java类与实现Java接口。CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口实现类的方法,还可以接管普通类的方法.
CGLib 的底层是Java字节码操作框架 —— ASM。
cglib 组织架构图
cglib是针对类来实现代理的,原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
代理模式
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理:在程序运行时,运用反射机制动态创建而成。
Code Demo:
代理类:
public class CglibProxy implements MethodInterceptor { /** * 根据class对象创建该对象的代理对象 * 1、设置父类;2、设置回调 * 本质:动态创建了一个class对象的子类 */ public <T> T getProxy(Class<T> cls) { return (T) Enhancer.create(cls, this); } // 回调方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(obj, args); after(); return result; } private void after() { System.out.println("after proc"); } private void before() { System.out.println("before proc"); } }
Enhancer的create方法:
public static Object create(Class type, Callback callback) { Enhancer e = new Enhancer(); e.setSuperclass(type); e.setCallback(callback); return e.create(); }
通过create方法可知,cglib通过把要代理的类作为父类,生成其子类来动态生成代理类。
普通Java类(没实现任何接口)
public class Lion{ public void run() { System.out.println("草原之王——狮子在跑"); } }
测试类
public class AppTest { @Test public void testCglib() { CglibProxy cglibProxy = new CglibProxy(); Lion lionProxy = cglibProxy.getProxy(Lion.class); lionProxy.run(); } }
相关推荐
java代理机制 JDK动态代理和cglib代理 详解
动态代理和cglib例子,动态代理和cglib例子动态代理和cglib例子动态代理和cglib例子
java静态代理 jdk动态代理 cglib动态代理 代理原理
NULL 博文链接:https://jummy.iteye.com/blog/255628
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
实现java动态代理的两个实例,jdk动态代理和cglib
jdk 的动态代理和CGLIB代理
JAVA JDK静态代理、动态代理、CGlib代理的代码演示 为对象增加功能
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
该资源里面有Jdk动态代理,cglib动态代理,反射和拦截器(链)示例,里面也有所需要的jar包,下载下来导入eclipse即可运行,有问题请问我
静态代理、jdk动态代理、cglib动态代理
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
JDK动态代理和Cglib动态代理实例源码
java动态代理和cglib动态代理示例分享共5页.pdf.zip
动态代理cglibjar包和源码动态代理cglibjar包和源码动态代理cglibjar包和源码动态代理cglibjar包和源码动态代理cglibjar包和源码
JDK代理和Cglib代理,下载源码清楚了解二者区别
NULL 博文链接:https://pluto418.iteye.com/blog/1692218
动态代理需要的包,cglib的动态代理需要的包。 动态代理需要的包,cglib的动态代理需要的包。