在学习https://www.bilibili.com/video/av40807069/?p=49的过程中,生成代理对象,源码如下:
SomeServiceIml.java:
package com.liping.proxy.cglib;
public class SomeServiceIml {
public String doSome() {
System.out.println("let`s do something here!");
return "abcd";
}
}
MyIntercector.java:
package com.liping.proxy.interceptor;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class MyIntercector implements MethodInterceptor {
private Object target;
public MyIntercector(Object target) {
super();
this.target = target;
}
public MyIntercector( ) {
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("==========intercept==========");
Object result = null;
// TODO Auto-generated method stub
result = method.invoke(target, args);
return result;
}
}
ProxyFactory .java:
package com.liping.proxy.interceptor;
import com.liping.proxy.cglib.SomeServiceIml;
import net.sf.cglib.proxy.Enhancer;
public class ProxyFactory {
public Object createProxy(Object target) {
Enhancer en = new Enhancer();
en.setSuperclass(SomeServiceIml.class);
en.setCallback(new MyIntercector(target));
return en.create();
}
}
Mytest .java:
package com.liping.proxy.test;
import com.liping.proxy.cglib.SomeServiceIml;
import com.liping.proxy.interceptor.ProxyFactory;
public class Mytest {
public static void main(String [] args) {
// TODO Auto-generated method stub
SomeServiceIml target = new SomeServiceIml();
ProxyFactory factory = new ProxyFactory();
SomeServiceIml proxy = (SomeServiceIml) factory.createProxy(target);
String str = proxy.doSome();
System.out.println("通过代理对象!"+str);
}
}
执行Mytest,报错信息如下:
Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type
at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:180)
at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:66)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
at com.liping.proxy.interceptor.ProxyFactory.createProxy(ProxyFactory.java:9)
at com.liping.proxy.test.Mytest.main(Mytest.java:12)
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 5 more
解决方法,参考https://www.cnblogs.com/gl-developer/p/7115644.html
asm 1.5.3.jar 匹配 cglib-2.1.3.jar
asm-2.X.jar asm-3.x.jar 匹配 cglib-nodep-2.1_3.jar
在网上下载并手动引入asm.jar文件。把asm.jar文件添加到项目路径类,运行,然后就正常了。