本帖最后由 杨兴庭 于 2013-8-7 18:09 编辑
问题描述:由于我的练习里面有道题需要生产一个类而不是接口的助理,所以我在网上查找到了CGlib的生产动态代理类的方法,但是呢,我把jar文件什么的都弄好了,然后也照着流程写出了生成动态代理类的代码,编译没问题,可运行时出错了,各位同学给看看吧,就当是玩大家来找茬了,呵呵。方法代码,其实方法很简单,也就是一个返回动态代理类的方法,:- public static Object getProxy1(final Object target){
- //在cglib中,是使用Enhancer对象来实现代理的,但是它实际上是生成的被代理类的子类,所以要代理哪个类就要把它设置为父类
- Enhancer en = new Enhancer();
- //为代理对象设置父类
- en.setSuperclass(target.getClass());
- //再设置一个回调函数,其实也就是一个拦截函数,当发生方法调用时,这个函数会把调用拦截下来。
- en.setCallback(new MethodInterceptor() {
- @Override
- public Object intercept(Object obj, Method method, Object[] args,
- MethodProxy proxy) throws Throwable {
-
- //加入的计算方法的执行时间的代码,我把它直接在内部打印到控制台。
- long startTime = System.currentTimeMillis();
- //调用目标类的方法,
- Object retval = method.invoke(target, args);
- long endTime = System.currentTimeMillis();
- System.out.println(method.getName()+"方法的执行时间为:"+(endTime-startTime)+"毫秒");
-
- return retval;
- }
- });
- //最后一切准备就绪,就可以创建这个代理对象了。
- return en.create() ;
- }
复制代码 下面是错误提示:- Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
- at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
- at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
- at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
- at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
- at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
- at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)
- at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
- at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
- at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
- at com.itheima.Test1.getProxy1(Test1.java:71)
- at com.itheima.Test1.main(Test1.java:32)
复制代码 各位看官也拿这个方法调用下试试看行不行吧!谢谢了!
|