黑马程序员技术交流社区
标题:
关于CGlib库的问题。
[打印本页]
作者:
杨玲
时间:
2013-8-5 08:30
标题:
关于CGlib库的问题。
本帖最后由 杨兴庭 于 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)
复制代码
各位看官也拿这个方法调用下试试看行不行吧!谢谢了!
作者:
杨玲
时间:
2013-8-5 08:35
本帖最后由 杨玲 于 2013-8-5 08:38 编辑
谢谢各位看官了!
作者:
佟都
时间:
2013-8-5 19:53
本帖最后由 佟都 于 2013-8-5 19:55 编辑
这段代码确实没问题,下面是我写的测试代码:
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.MethodInterceptor;
public class TmpTest {
/**
* 临时测试
*/
public static void
main(String[] args) throws Exception {
TmpTest tt =
(TmpTest)TmpTest.getProxy1(new
TmpTest());
tt.sop(tt);
}
public
static void sop(Object obj) {
System.out.println("sop:"+
obj);
}
public static Object getProxy1(final Object target){
……
//最后一切准备就绪,就可以创建这个代理对象了。
return
en.create() ;
}
}
复制代码
运行结果:
toString方法的执行时间为:0毫秒
sop:alex.simon.test.TmpTest@178dc08
复制代码
作者:
杨玲
时间:
2013-8-6 02:19
佟都 发表于 2013-8-5 19:53
这段代码确实没问题,下面是我写的测试代码:运行结果:
这么说来是我编译器设置出了问题了。。。不应该呀,纠结
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2