CGLib實現動態代理區別於JDK動態代理,不需要目標類實現任何接口,是通過生成代理類子類的方式,而且據說速度要快於JDK動態代理。所以我想要試驗一下CGlib的動態代理,網上找了些例子,自己動手寫了一個Demo,運行時拋出以下異常
這個異常說明的很清楚,因為使用了CGlib的Enhancer類,這個類用於為非接口類型創建一個Java代理,類里面使用了org.objectweb.asm.Type。ASM是一個字節碼解析的工具,導入ASM的jar即可解決該問題,PS:如果使用Maven構建項目就不會出現這個問題
在這里貼一下我寫的Deam,目標類:
public class Cat { public void say() { System.out.println("我是一只貓"); } }
代理類:
import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CatProxy implements MethodInterceptor{ //目標對象,這里使用Object private Object target; /** * 代理對象創建過程 * @param target * @return */ public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); //public interface MethodInterceptor extends Callback 所以這里可以給this enhancer.setCallback(this); Object proxy = enhancer.create(); return proxy; //返回代理對象 } @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("---------doSomething-------Start"); Object proxy = arg1.invoke(target, arg2); System.out.println("---------doSomething-------End"); return proxy; } public static void main(String[] args) { Cat cat = (Cat) new CatProxy().getInstance(new Cat()); cat.say(); } }
更多關於CGLib的介紹可以參照以下博文:
https://www.cnblogs.com/mr-long/p/5889054.html
http://www.cnblogs.com/icejoywoo/archive/2011/06/05/2072970.html