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();