A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨玲 中级黑马   /  2013-8-5 08:30  /  1078 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-8-7 18:09 编辑

问题描述:由于我的练习里面有道题需要生产一个类而不是接口的助理,所以我在网上查找到了CGlib的生产动态代理类的方法,但是呢,我把jar文件什么的都弄好了,然后也照着流程写出了生成动态代理类的代码,编译没问题,可运行时出错了,各位同学给看看吧,就当是玩大家来找茬了,呵呵。方法代码,其实方法很简单,也就是一个返回动态代理类的方法,:
  1. public static Object getProxy1(final Object target){
  2.                 //在cglib中,是使用Enhancer对象来实现代理的,但是它实际上是生成的被代理类的子类,所以要代理哪个类就要把它设置为父类
  3.                 Enhancer en = new Enhancer();
  4.                 //为代理对象设置父类
  5.                 en.setSuperclass(target.getClass());
  6.                 //再设置一个回调函数,其实也就是一个拦截函数,当发生方法调用时,这个函数会把调用拦截下来。
  7.                 en.setCallback(new MethodInterceptor() {

  8.                         @Override
  9.                         public Object intercept(Object obj, Method method, Object[] args,
  10.                                         MethodProxy proxy) throws Throwable {
  11.                                 
  12.                                 //加入的计算方法的执行时间的代码,我把它直接在内部打印到控制台。
  13.                                 long startTime = System.currentTimeMillis();
  14.                                 //调用目标类的方法,
  15.                                 Object retval = method.invoke(target, args);
  16.                                 long endTime = System.currentTimeMillis();
  17.                                 System.out.println(method.getName()+"方法的执行时间为:"+(endTime-startTime)+"毫秒");
  18.                                 
  19.                                 return retval;
  20.                         }
  21.                 });
  22.                 //最后一切准备就绪,就可以创建这个代理对象了。
  23.                 return en.create() ;
  24. }
复制代码
下面是错误提示:
  1. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
  2.         at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
  3.         at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
  4.         at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
  5.         at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
  6.         at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
  7.         at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)
  8.         at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
  9.         at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
  10.         at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
  11.         at com.itheima.Test1.getProxy1(Test1.java:71)
  12.         at com.itheima.Test1.main(Test1.java:32)

复制代码
各位看官也拿这个方法调用下试试看行不行吧!谢谢了!

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 杨玲 于 2013-8-5 08:38 编辑

谢谢各位看官了!
回复 使用道具 举报
本帖最后由 佟都 于 2013-8-5 19:55 编辑

这段代码确实没问题,下面是我写的测试代码:
  1. import java.lang.reflect.Method;
  2. import net.sf.cglib.proxy.Enhancer;
  3. import net.sf.cglib.proxy.MethodProxy;
  4. import net.sf.cglib.proxy.MethodInterceptor;
  5. public class TmpTest {
  6. /**
  7.   * 临时测试
  8.   */
  9. public static void
  10. main(String[] args) throws Exception {
  11.   TmpTest tt =
  12. (TmpTest)TmpTest.getProxy1(new
  13. TmpTest());
  14.   tt.sop(tt);
  15. }

  16. public
  17. static void sop(Object obj) {
  18.   System.out.println("sop:"+
  19. obj);
  20. }

  21. public static Object getProxy1(final Object target){
  22. ……
  23. //最后一切准备就绪,就可以创建这个代理对象了。
  24.         return
  25. en.create() ;
  26. }
  27. }
复制代码
运行结果:
  1. toString方法的执行时间为:0毫秒
  2. sop:alex.simon.test.TmpTest@178dc08
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
佟都 发表于 2013-8-5 19:53
这段代码确实没问题,下面是我写的测试代码:运行结果:

这么说来是我编译器设置出了问题了。。。不应该呀,纠结
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马