java - 目录结构错误的 NoClassDefFoundError 解决方法

标签 java classloader

我正在尝试让自定义类加载器来加载随机.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/

相关文章:

java - 在 OSGi Bundle 中使用 JavaCompiler

java - 如何对 Eclipse 项目使用非 URLClassLoader 类加载器,或者以其他方式检测我正在 Eclipse 中运行?

Java继承概念

java - 事务标记为仅回滚,原因未知

java - Extjs 和 Spring MVC XMLHttpRequest 无法加载预检响应具有无效的 HTTP 状态代码 403

java - 在启动Intent之前更改布局内容,例如文本和图像

java - 改造 - Json 响应可以根据类型包含不同的字段

java - 如何从两个单独的类加载器创建 java.lang.reflect.Proxy?

检测 eclipse rcp 应用程序时出现 java.lang.ClassNotFoundException

java反射: Is it possible to override a private method by change method Id?