错误目录结构的解决方法 NoClassDefFoundError
Workaround NoClassDefFoundError for wrong directory structure
我正在尝试获取自定义 classloader 来加载随机 .class
文件,这些文件可能位于文件系统的任何位置。我编写了 class 加载器来扩展 ClassLoader
,覆盖 findClass()
和 loadClass()
方法,并读入 class 文件的字节流。尝试调用 ClassLoader.defineClass()
时出现问题
我得到的确切错误是:
Exception in thread "main" java.lang.NoClassDefFoundError: Test (wrong name: com/foo/bar/Test)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
我知道问题在于原生 class 加载函数不喜欢 Test.class
不存在于 /someDir/com/foo/bar/
中这一事实。有什么办法可以使这项工作吗?我的 classloader 已经有代码来检查定义的 class 是否符合特定的包。我真的不明白为什么本机方法会不允许这样做(除了安全性,我在这个用例中不需要它,然后事件,让我搬起石头砸自己的脚)。
本机 class 加载器,即 ClassLoader.defineClass1
,对目录结构一无所知。它只是加载一个字节数组。
错误消息说二进制名称作为参数传递给 defineClass
does not match the actual name discovered from the class data bytes. The easiest workaround is to set name=null
when calling defineClass
。
注意:您不能通过简单地将 class 的包移动到不同的目录来更改它。包名称嵌入在 class 文件数据中。您必须使用正确的 package
指令重新编译源代码,或者在加载时使用字节码检测框架修改 class 文件字节。
我正在尝试获取自定义 classloader 来加载随机 .class
文件,这些文件可能位于文件系统的任何位置。我编写了 class 加载器来扩展 ClassLoader
,覆盖 findClass()
和 loadClass()
方法,并读入 class 文件的字节流。尝试调用 ClassLoader.defineClass()
我得到的确切错误是:
Exception in thread "main" java.lang.NoClassDefFoundError: Test (wrong name: com/foo/bar/Test)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
我知道问题在于原生 class 加载函数不喜欢 Test.class
不存在于 /someDir/com/foo/bar/
中这一事实。有什么办法可以使这项工作吗?我的 classloader 已经有代码来检查定义的 class 是否符合特定的包。我真的不明白为什么本机方法会不允许这样做(除了安全性,我在这个用例中不需要它,然后事件,让我搬起石头砸自己的脚)。
本机 class 加载器,即 ClassLoader.defineClass1
,对目录结构一无所知。它只是加载一个字节数组。
错误消息说二进制名称作为参数传递给 defineClass
does not match the actual name discovered from the class data bytes. The easiest workaround is to set name=null
when calling defineClass
。
注意:您不能通过简单地将 class 的包移动到不同的目录来更改它。包名称嵌入在 class 文件数据中。您必须使用正确的 package
指令重新编译源代码,或者在加载时使用字节码检测框架修改 class 文件字节。