【发布时间】:2015-04-28 19:55:29
【问题描述】:
我有一个项目,它的构建路径上有另一个项目,其中有一个 java.lang 包,里面有一个修改过的 String 实现。不知何故,我曾经使用股票 OpenJDK 7 JRE 以简单的运行配置启动了这个项目,并加载了修改后的 String 类(我认为至少因为在代码中被强制转换为仅由修改后的 String 实现的接口)。但是最近我可能已经改变了一些东西(我不知道是什么)并且我得到一个运行时 ClassCastException 显然是因为加载了原始的 String 类。 我尝试在一个演示项目中自己替换 String 类,虽然当我启动应用程序时自动完成和转到声明返回了我的 String 类,但情况并非如此,并且加载了 stock String 并且我的应用程序无法运行。
问题是:如何从 JRE 替换(/覆盖)类(不使用自定义类加载器)?还有如何证明我的经验是合理的?
【问题讨论】:
-
用您自己的自定义版本替换标准 JDK 类是一个可怕的想法,可能会破坏一切。请不要这样做。
-
String是一个final类,不打算扩展。如果您想更改实现以提供其他内容,那么将其放在您自己的包中并单独保留 JDK 会是一个更好的主意。不过我同意 Jesper 的观点,批量更改标准类可能不是一个好主意。 -
我知道这不是一个好主意,但我的项目涉及 Java 字节码的检测,最终会改变类。因此,即使不是全部 JRE 类,也不可避免地要更改一些。问题仍然存在:我怎样才能体验到我所描述的?
标签: java class jvm classloader