cglib 代理框架
什么是cglib?ide
一段介绍是这样的:性能
CGLIB(Code Generation Library)是一个开源项目!this
是一个强大的,高性能,高质量的Code生成类库,它能够在运行期扩展Java类与实现Java接口。spa
CGLIB包的底层是经过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。代理
Spring AOP和Hibernate同时使用JDK的动态代理和CGLIB包。code
cglib 代理特色:对象
CGLIB 是针对类来实现代理,它的原理是对指定的目标类生成一个子类,并覆盖其中方法。blog
由于采用的是继承,因此不能对 finall 类进行继承。继承
须要用到两个jar: cglib 和 asm
实例:
一、一个Hello 类,是目标对象
/** 没有接口的类 * Created by hp on 14-7-27. */ public class Hello { public void sayHello() { System.out.println("Hello ,world"); } }
二、代理类CglibProxy,
/** Cglib 动态代理 * Created by hp on 14-7-27. */ public class CglibProxy implements MethodInterceptor { private Object object; /* 建立代理对象 * @param object * @return */ public Object getProxyInstance(Object object) { this.object = object; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(object.getClass()); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("哥去买包烟先,再帮你打包"); Object result = method.invoke(object, args); System.out.println("垃圾太多了,倒掉吧"); return result; } }
三、客户端调用
CglibProxy cglibProxy = new CglibProxy(); Hello hello = (Hello)cglibProxy.getProxyInstance(new Hello()); hello.sayHello();