如何使jvm加载我的java.lang.String而不是rt.jar中的那个

我经常研究java类加载器。 现在我想编写一个与rt.jar中的类名相同的包名和类名的类。 例如,自己编写一个java.lang.String类,以及如何打破父代委托模型以使jvm加载我的java.lang.String而不是rt.jar中的那个。

重新编辑
谢谢,试了一下。 ↓↓↓


     D:\> java -verbose -Xbootclasspath / p:D:/myrt.jar -jar exe.jar
     [打开D:\ myrt.jar]
     [打开C:\ java \ jre \ lib \ rt.jar]
     [从C:\ java \ jre \ lib \ rt.jar加载java.lang.Object]
     [从D:\ myrt.jar加载java.lang.String]
     [从C:\ java \ jre \ lib \ rt.jar加载java.io.Serializable]
     [从C:\ java \ jre \ lib \ rt.jar加载java.lang.reflect.GenericDeclaration]
     [从C:\ java \ jre \ lib \ rt.jar加载java.lang.reflect.Type]
     [从C:\ java \ jre \ lib \ rt.jar加载java.lang.reflect.AnnotatedElement]
     [从C:\ java \ jre \ lib \ rt.jar加载java.lang.Class]
     java.lang.String的布局值无效
     #
     #Java Runtime Environment检测到致命错误:
     #
     #Internal Error(javaClasses.cpp:136),pid = 6968,tid = 4116
     #damal error:预加载类的布局无效
     #
     #JRE版本:(7.0_45-b18)(build)
     #Java VM:Java HotSpot(TM)64位服务器VM(24.45-b08混合模式windows-amd64
     压缩的oops)
     #无法写入核心转储。 默认情况下,客户端vers上未启用小型转储
     Windows的离子
     #
     #包含更多信息的错误报告文件保存为:
     #D:\\ hs_err_pid6968.log
     #
     #如果您想提交错误报告,请访问:

您可以在JVM启动时使用-Xbootclasspath/p选项执行此操作:

 -Xbootclasspath/p:/path/to/yourimpl.jar 

/p代表“prepend”。

注意: -Xbootclasspath不是标准的java选项,因此不同供应商的JVM可能不支持它。

看一下java.lang.instrumentation API :您可以实现一个ClassFileTransformer,它忽略传入的字节数组并返回一个包含您自己的java.lang.String实现的bute数组。

更好地确保它与原始版本完全二进制兼容,或者你不会走得太远。