java - 使用 Unsafe.defineClass 定义类而不解析依赖项
问题描述
由于我的程序的要求,我需要在运行时使用 null 类加载器(引导类加载器)定义多个类。
这通常很容易使用类似的东西
unsafe.defineClass(name, bytes, 0, bytes.length, null, null);
但是,如果我需要定义 5 个不同的类,每个类都相互引用,这不起作用。JVM 尝试在定义这些类之前解析它们,从而导致 NoClassDefFoundError。
当我用 unsafe.defineClass 定义类时,有没有办法阻止 JVM 解析类?
如果没有,是否有可能使用 JNI 来做到这一点?
这个问题类似于这个问题,但是提供的答案不合适,因为它包括在非空类加载器下定义类。
解决方案
Unsafe.defineClass
不解析类,如JVMS §5.4.3中所述。常量池中的大部分符号引用仍未解决。
在类定义时需要满足的唯一依赖项是
- 实现的接口列表;
- 超类。
任何有效的类集都可以按以下方式排序
- 对于正在定义的任何类或接口
C
,所有接口C
实现之前都已经定义,并且C
之前也定义了超类。
这意味着,如果以正确的顺序完成,可以一个一个地定义类。上述条件不仅在循环继承的情况下成立(无论如何都是无效的)。
但请确保在定义所有引用的类之前不要初始化类或以其他方式导致类解析。
推荐阅读
- java - 如何在java中用括号对长布尔表达式进行换行
- popupwindow - 禁用“离开网站?” 关闭 Orbeon 窗体窗口时弹出
- python - Python - 使用正则表达式在字典中查找键
- .net - ABP框架中微服务的Message和RabbitMQ
- angular - 将数组属性作为单个字符串而不是字符串 []
- javascript - 如何检查验证输入日期字段
- linux - 为什么我会从此代码中收到 Invalid typecast 错误?
- r - 文本清理 gsub 删除所有内容,直到找到换行符
- pytorch - PyTorch中如何优化指定范围内的参数?
- reactjs - React - 带有 `document.body` 的`createPortal` 导致点击事件立即触发