【问题标题】:Custom Java Core Class自定义 Java 核心类
【发布时间】:2011-10-26 10:39:05
【问题描述】:

我对修补核心 Java 类很感兴趣。 诸如String、Graphics (Swing) 之类的数据类型以及来自lib/rt.jar 的类。

所以在我看来,有几种方法可以做到这一点:

  1. 创建一个自定义类并将它们包含在 JVM 中,然后使用 -Xbootclasspath 运行 jvm
  2. 编写一个新的引导加载程序,它将 Java 代码插入到自定义类中
  3. 在加载时使用代理和仪器字节码(对这个不太熟悉)

我想听听您对方法的建议/意见,也许我错过了什么?

【问题讨论】:

  • 建议:不要。你几乎肯定会后悔的。
  • 有时是“男人该做的事”;)

标签: java class classloader


【解决方案1】:

使用引导类路径更改此类类可能违反您的许可协议。 (如果这与您有关)似乎允许更改字节码。

另一种更改系统类的方法是将 jar 添加到 jre/lib/endorsed 目录(您必须创建该目录)它会优先加载此处的任何内容。

更改 String 类可能会混淆 -XX:UseCompressedStrings 选项。您可能想测试任何更改后会发生什么。

我在测试中这样做是为了从系统中获得额外的分析。我没有尝试将这些类更改为生产使用。

我怀疑您尝试做的任何事情都可能以另一种方式完成,但没有更多细节就不可能说出来。

【讨论】:

  • 感谢 Peter 提到许可证问题,我不知道这一点。长话短说,我希望能够将自定义代码注入/检测到正在加载的任何 java 类中,用于监控、分析等目的。我知道可用的分析器,但我想进行一些“行为”分析(我想知道这句话是否有意义)
  • 也许 AOP 是最简单的方法。这会为您进行字节码注入。它允许您在输入/退出方法时注入代码。例如记录此类事件。
  • 好的,听起来不错。我会研究一下,如果你有任何推荐的地方我可以开始(而不是深入研究 AOP),那就太好了!但是我可以通过Agents实现这种行为吗?
  • 可以,但字节码操作是一项棘手的工作。使用 AOP,您可以编写一些看起来像 Java 的东西。 AOP 可以为运行时字节码注入提供代理。这里有一些框架java-sources.net/open-source/aspect-oriented-frameworks
【解决方案2】:

另一种选择是下载/签出 OpenJDK 源代码并自行构建并包含您的修改。

但不要称它为 Java。你所做的很可能会导致它与真实的东西不兼容。

有时“男人必须做男人必须做的事”;)

引用约翰·韦恩的话并不能使您提出的建议成为明智之举。


不,不,不。我希望它与 HotSpot 兼容。

与 HotSpot 的兼容性不足。在“java”实现中使用 Java 商标有严格的规定。只有在已通过 Java STK 测试的情况下,您才可以调用您的实现 Java。

并且“我希望它兼容”与“兼容”的含义不同,这忽略了您所说的兼容问题。

【讨论】:

  • 不,不,不。我希望它与 HotSpot 兼容,这就是为什么要询问代理。如果您有任何适合我需要的建设性建议,我将非常乐意听到。
  • @PavelK - 如果您愿意正确阅读我的答案,您会发现它是一个建设性的答案。提示:第一句话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多