如何使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数组。
更好地确保它与原始版本完全二进制兼容,或者你不会走得太远。