我正在尝试让自定义类加载器来加载随机.class
可以位于文件系统上任何位置的文件。我编写了我的类加载器来扩展 ClassLoader
,覆盖 findClass()
和loadClass()
方法,并读入类文件的字节流。尝试调用 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)
我知道问题在于 native 类加载函数不喜欢 Test.class
不住在/someDir/com/foo/bar/
。我有什么办法可以让这项工作成功吗?我的类加载器已经有代码来检查定义的类是否符合特定的包。我真的不明白为什么 native 方法会不允许这样做(除了安全性,在这个用例中我不需要安全性,然后发生事件,让我搬起石头砸自己的脚)。
最佳答案
native 类加载器,即ClassLoader.defineClass1
,不知道有关目录结构的任何信息。它只是加载一个字节数组。
错误消息表明二进制名称作为参数传递给 defineClass
与从类数据字节中发现的实际名称不匹配。最简单的解决方法是在调用 defineClass
时设置 name=null
.
注意:您不能通过简单地将类的包移动到不同的目录来更改它。包名称嵌入在类文件数据中。您必须使用正确的 package
指令重新编译源代码,或者在加载时使用字节码检测框架修改类文件字节。
关于java - 目录结构错误的 NoClassDefFoundError 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39581436/