1

我使用 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)
... at 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
at java.net.URLClassLoader$1.run(URLClassLoader.java:200 )
在 java.security.AccessController.doPrivileged(Native Method)
...
在 java.lang.ClassLoader.loadClass(ClassLoader.java:252)
在 java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 43更多的

这似乎是 tomcat 类加载器的问题,因为如果我将其作为应用程序运行,上述所有代码都可以工作,有人能帮我解决它吗?
感谢

4

1 回答 1

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”

于 2012-05-29T01:11:11.370 回答