开始时使用的jar包:
asm-2.2.3.jar
cglib-2.2.jar
代码如下:
package proxy.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* Cglib动态代理:可以不用像JDK的对象使用动态代理必须要实现一个或多个接口
* @author frank
* 2015-4-28上午11:47:58
*/
public class CglibDemo {
public static void main(String[] args) {
Test tset=(Test) new MyCglib().getInstance(new Test());
tset.start();
}
}
class Test{
public void start(){
System.out.println("start...");
}
public void stop(){
System.out.println("stop...");
}
}
class MyCglib implements MethodInterceptor{
public Object getInstance(Object o){
Enhancer e=new Enhancer();
e.setSuperclass(o.getClass());
e.setCallback(this);
return e.create();
}
@Override
public Object intercept(Object object, Method method, Object[] objects,MethodProxy proxy) throws Throwable {
System.out.println("->");
proxy.invokeSuper(object, objects);
System.out.println("-<");
return null;
}
}
一运行:
Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)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:144)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:116)
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 proxy.cglib.MyCglib.getInstance(CglibDemo.java:36)
at proxy.cglib.CglibDemo.main(CglibDemo.java:21)
经过资料查找发现是jar包问题:
把cglib-2.2.jar换成cglib-nodep-2.1_3.jar完美解决问题。
运行结果:
->
start...
-<