双亲委派机制通过委托链拦截和包名校验,从源头阻断恶意类加载:java.*等受保护包名类只能由bootstrap classloader加载,非bootstrap加载器定义会抛securityexception,同名类因加载器不同而无法兼容,确保核心类可信。

双亲委派机制在安全性上主要防范的是核心类库被恶意替换或篡改的风险,不是靠事后检测,而是在加载流程的每个关键环节主动阻断——它从根源上让攻击者“根本没机会把恶意类放进 JVM”。
防止伪造 java.* 类并劫持基础行为
攻击者若在项目中定义 package java.lang; public class String { ... },该类永远不会被加载使用。因为:
- 所有对
java.lang.String的引用,都会触发委托链,最终由 Bootstrap ClassLoader 从java.base模块(Java 9+)或rt.jar(Java 8)中加载官方版本; - 你的自定义类连被扫描的机会都没有——请求在到达你本地 classpath 前就被拦截并返回系统版本。
阻止非 Bootstrap 加载器定义受保护包名的类
即使绕过委托(如重写 loadClass 并直接调用 defineClass),JVM 仍会在字节码转为 Class 对象时强制校验:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 只要类全限定名以
java.、javax.、sun.等前缀开头; - 且当前加载器不是 Bootstrap ClassLoader;
- 就会立即抛出
SecurityException,而非ClassNotFoundException。
这意味着:恶意字节码连定义都失败,更谈不上实例化或执行。
避免同名类跨加载器污染导致的类型混淆
Java 规定“同一类 = 全限定名 + 加载器实例”。所以:
- 哪怕你用非常规手段加载了一个
java.lang.String(比如修改 JVM 启动参数),它也和系统String属于不同命名空间; -
new String()创建的是 Bootstrap 加载的实例; - 你加载的“同名类”无法赋值给任何
String类型变量,也无法参与方法调用、反射或泛型推导。
切断恶意代码对运行时信任链的破坏路径
核心类(如 ClassLoader、SecurityManager、Class)一旦被篡改,整个沙箱模型就崩塌。双亲委派配合包名校验,确保:
- 这些类只由 JVM 底层 C++ 实现的 Bootstrap 加载器加载;
- 其字节码来源唯一、不可替换、不可代理;
- 后续所有类加载、权限检查、反射控制等安全机制,都建立在这个可信根之上。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










