我使用asm来实现代理模式。
例如:
原始类是test.service.Service
public class ProxyFactory{
public static Object generateProxy(Class<?> argument){
//do generate use asm.
//generate a proxyClass that extends argument
//and override the sayHello() method
//and than invoke System.out.println("anything") before we call super.sayHello()
Class<?> class = proxyClass;
return class.newInstance();
}
}
public class Service implements IService{
@Override
public List<String> sayHello(){
List<String> list = new ArrayList<String>();
list.add("stackoverflow user");
return list;
}
}
public class Action extends ActionSupport{
private IService service = ProxyFactory.generateProxy(Service.class);
}
当我请求此操作时,将是异常:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
在java.lang.Thread.run(Thread.java:619)
引起:java.lang.NoClassDefFoundError:test.service.Service
at java.lang.ClassLoader.defineClass1(Native Method)
...
... 40多了
引起:java.lang.ClassNotFoundException:test.service.Service
在java.net.URLClassLoader $ 1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
...
在java.lang.ClassLoader.loadClass(ClassLoader.java:252)
在java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 43更多
它看起来像tomcat类加载器问题,因为如果我运行它,所有上面的代码都可以工作,因为应用程序可以让任何人帮我解决它。
感谢
答案 0 :(得分:0)
我自己解决,实际上,正如我所料,问题是由类加载器引起的 这是在代码之前:
byte[] b = class byte code...
ClassLoder loader = ClassLoader.getSystemClassLoader();
Class<?> cls = Class.forName("java.lang.ClassLoader");
java.lang.reflect.Method method = cls.getDeclaredMethod(
"defineClass", new Class[] { String.class, byte[].class,
int.class, int.class });
method.setAccessible(true);
Object[] args = new Object[] { sc.getName(), b, new Integer(0),
new Integer(b.length) };
clazz = (Class<?>) method.invoke(loader, args);
现在我使用Thread.currentThread()。getContextClassLoader()代替了ClassLoader.getSystemClassLoader();
这意味着我们可以使用tomcat类加载器来定义我们的类,因此可以找到我们的web
应用程序类“test.service.Service”