通过将源代码复制到我的项目来调试 rt.jar 中的 类

Debug classes in rt.jar by copying their source to my project

我刚刚发现有一种简单的方法可以 debug/hack 我在项目中使用的第三方库。

例如,如果我想从 spring-beans 调试 org.springframework.beans.factory.support.AbstractBeanDefinition,我需要做的就是在我的项目中的同一个包中创建这个 class 的副本同一个来源。由于我的项目源恰好出现在 class 路径的较早位置,因此 ClassLoader 将使用它们而不是来自 spring-beans 的那些。然后我可以将 logging/breakpoints/tweaks 添加到标准 class 行为中,因为现在源在我的控制之下。

但这不适用于位于 rt.jar 中的标准 Java classes。例如,它不适用于 java.util.HashMap。有什么方法可以使用与 rt.jar classes 相同的方法吗?

您必须将替换 classes 放在单独的目录或 JAR 文件中,并将其添加到 bootstrap class使用 java 命令的 -Xbootclasspath/p 选项的路径。您不应分发任何使用此机制覆盖 rt.jar classes 的代码,但可以用于调试目的。

请注意,您应该只将 bootstrap class 路径用于真正需要的东西(特定的 class 文件替换 classes 来自 rt.jar).你的应用程序的其余部分应该保持在正常的 class 路径上,由系统 classloader 加载,因为 bootstrap 和系统加载器之间可能还有其他加载器(例如扩展) 如果您的代码位于 bootstrap class 路径上,则您的代码将无法使用。