使用ClassLoader.defineClassCond从通过ASM创建的类的字节中获取Class对象,NoClassDefFoundException?

时间:2011-10-15 19:38:35

标签: java class assembly noclassdeffounderror

我通过获取基类的字节并通过自定义类适配器接受它来生成一个类。当我在作为基类产品生成的字节上调用define class时,我得到了这个错误:

Caused by: java.lang.NoClassDefFoundError: com/example/MyClassBase
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    ... 24 more
Caused by: java.lang.ClassNotFoundException: com.example.MyClassBase
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 26 more

基类已由jar中的URLClassLoader加载。在defineClass中是否有一些底层方法调用抛出异常,因为它找不到加载的类?我该如何解决这个问题?

请记住,以不同的方式加载基类是不切实际的。作为问题的参数,我会假设它必须通过另一个jar的URLClassLoader加载。

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试通过无法看到该类的ClassLoader加载依赖于com.example.MyClassBase的修改后的字节码。当您创建自己的ClassLoader实例以加载修改后的类时,您应该chaining it to an existing ClassLoader using its constructor建立加载器的父/子层次结构,这有助于避免这个确切的问题。