破坏双亲委派之后,能重写String类吗?

文章内容收录到个人网站,方便阅读:hardyfish.top/

Java虚拟机规范.Java SE 8版:

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版):

在 Java 中,即使破坏了 双亲委派模型 ,理论上依然无法完全重写 java.lang.String 类。

这是因为 JVM 对 String 类有特殊的限制和处理机制,具体如下:

原因分析

  1. JVM 内置限制

    • java.lang.String 是 JVM 的核心类,其加载和使用受到严格限制。JVM 会优先加载和使用由引导类加载器(Bootstrap ClassLoader)加载的 String 类。
    • 即使你破坏了双亲委派模型,定义了自己的 java.lang.String 类,JVM 在加载和运行中仍会优先使用引导类加载器加载的原生 String 类。
  2. 类加载机制

    • 引导类加载器加载的类是 JVM 的核心组件(如 java.lang 包下的类),例如 java.lang.Stringjava.lang.Object 等。
    • 这些核心类无法被用户自定义的类加载器替换或重新加载,即使破坏双亲委派,java.lang.String 依然会被优先加载,且不允许被覆盖。
  3. 安全性限制

    • Java 标准库中 java.lang.String 的不可替换性是 JVM 保证平台安全性和一致性的基础。如果允许替换 String,可能会导致各种意料之外的安全问题。

defineClass() 方法的限制

  • JVM 提供的 ClassLoaderdefineClass() 方法会对类的全限定名进行检查:

    • 如果类的全限定名以 java. 开头,则直接抛出 SecurityException,防止覆盖 java 包下的核心类。
  • 这项检查在 JVM 的底层实现中被硬编码,无法通过常规方式绕过。

尝试覆盖 java.lang.String 的结果

示例代码:假设你尝试自定义一个 java.lang.String 类:

Java 复制代码
package java.lang;
​
public class String {
    public String() {
        System.out.println("My String");
    }
}

编译结果

编译时会提示错误:

vbnet 复制代码
error: cannot access java.lang.String

这是因为 Java 禁止用户在 java.lang 包下定义核心类。

绕过编译检查

使用某些工具或方法绕过编译检查(如直接修改 .class 文件),在运行时仍然会因为类加载机制而失败。

破坏双亲委派的场景

即使破坏双亲委派模型(如自定义类加载器,优先加载用户定义的类),由于 JVM 会始终优先使用引导类加载器加载核心类,因此你定义的 java.lang.String 仍无法被 JVM 认可。

总结

破坏双亲委派模型后依然无法重写 java.lang.String

原因包括:

  • JVM 对核心类的优先加载机制。
  • java.lang.String 的安全性限制。
  • JVM 内部对 String 类的特殊处理。

如果尝试修改或替换 String,可能导致程序运行异常甚至 JVM 崩溃。建议在 Java 开发中不要尝试替换或覆盖核心类。

相关推荐
BUG制造机.5 分钟前
Go 语言 slice(切片) 的使用
开发语言·后端·golang
说淑人7 分钟前
Spring Cloud & 以Gateway实现限流(自定义返回内容)
java·spring cloud·gateway·限流
柴薪之王、睥睨众生8 分钟前
(自用)Java学习-5.12(Redis,B2C电商)
java·开发语言·学习
小鸡脚来咯13 分钟前
请求参数:Header 参数,Body 参数,Path 参数,Query 参数分别是什么意思,什么样的,分别通过哪个注解获取其中的信息
java·spring boot·后端
一只鹿鹿鹿14 分钟前
智慧能源大数据平台建设方案(PPT)
java·大数据·数据库·能源
刃神太酷啦1 小时前
类和对象(1)--《Hello C++ Wrold!》(3)--(C/C++)
java·c语言·c++·git·算法·leetcode·github
阿乾之铭1 小时前
Java后端文件类型检测(防伪造)
java·开发语言
console.log('只想发财')1 小时前
新手安装java所有工具(jdk、idea,Maven,数据库)
java·maven·intellij-idea
添砖Java中1 小时前
深入剖析缓存与数据库一致性:Java技术视角下的解决方案与实践
java·数据库·spring boot·spring·缓存·双写一致性