错误目录结构的解决方法 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 文件字节。