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
原文地址:https://www.cnblogs.com/lz2017/p/10189875.html
时间: 2024-10-12 16:25:43