【问题标题】:Limitations to modifying rt.jar修改 rt.jar 的限制
【发布时间】:2010-12-03 15:29:23
【问题描述】:

在 rt.jar 中修改类有什么限制。我意识到这通常特定于 JRE 的版本和供应商。例如,我发现 Sun 1.6 VM 中的 Hotspot 不喜欢向 java.lang.Object 添加字段,因为它对 Object 的大小进行了硬编码假设。但是,如果我修改 rt.jar 中类的重要部分,对于肯定在我的 jar 中的类,我会在运行时得到虚假的 ClassNotFoundErrors。我已经尝试修改 rt.jar 并用各种 -Xbootclasspath 参数取代它。

我真的不知道在哪里可以找到关于这类事情的文档,例如,我在 OpenJDK 文档中找不到任何内容。

【问题讨论】:

  • 我很好奇您这样做的原因?
  • 向 Object 添加一个字段会消耗大量内存空间和垃圾回收时间。
  • 我也很好奇您为什么觉得需要编辑基类。除了在 JDK 类中构建不可移植的更改之外,可能还有另一种解决问题的方法。
  • 如果您确实确定要编辑基类,您是否检查过是否可以使用 AspectJ 或如 Amir 所说的使用 ASM 实现您想要的? eclipse.org/aspectj
  • 我正在尝试为所有字段写入添加写时复制语义,以便它们可以自动检查点和回滚。

标签: java internals jvm-hotspot


【解决方案1】:

您是否考虑过使用字节码检测库来实现您想要的?您可以使用ASM + java.lang.instrument,JDK 大于或等于 5.0

【讨论】:

  • 事实上,这正是我正在做的事情。问题是我无法使用这种技术获得某些核心类,因为在我运行我的检测代码时它们已经被加载。我的后备是先修改这些类(或整个 rt.jar),这就是我遇到麻烦的地方。
  • 我的两分钱是当你尝试重新定义这些类时,你可能会得到 unmodifiableClassException
猜你喜欢
  • 2016-08-06
  • 2012-05-12
  • 1970-01-01
  • 2010-10-26
相关资源
最近更新 更多