Java中双亲委派模型指什么及用途?
下文笔者讲述java中双亲委派模型的简介说明,如下所示
双亲委派模型简介
双亲委派模型(Parent Delegation Model) 是Java类加载器(ClassLoader)的一种机制。 在这种机制中,当一个类加载器收到类加载请求时,它不会直接去加载这个类, 而是先将该请求委托给父类加载器去完成, 只有当父类加载器无法加载该类时,才会尝试自己去加载。
双亲委派模型的工作流程
1.启动类加载器(Bootstrap ClassLoader):
这是最顶层的类加载器,负责加载Java核心库(如`java.lang.*`)
通常由JVM实现,无法直接被Java程序访问。
2.扩展类加载器(Extension ClassLoader):
负责加载Java的扩展库(位于`$JAVA_HOME/lib/ext`目录下的jar包)
3.应用程序类加载器(Application ClassLoader):
也叫系统类加载器,负责加载用户类路径(classpath)上的类。
当某个类加载器需要加载一个类时:
- 首先会将请求委派给其父类加载器
(递归向上直到Bootstrap ClassLoader)
- 如果父类加载器能够加载,则完成加载:
否则,当前类加载器再尝试加载
双亲委派模型的用途
1.保证类的唯一性:
通过双亲委派模型,
确保Java核心类库中的类不会被用户自定义的类覆盖。
例如
无论用户如何编写自己的`java.lang.Object`类,
都无法替代JDK中真正的`Object`类。
2.安全性:
防止恶意代码对核心类进行篡改,
从而保护JVM的安全性和稳定性。
3.模块化加载:
通过分层的类加载器结构,
实现了不同层次的类加载需求,
使得Java应用可以灵活地加载不同来源的类
例
public class MyClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
byte[] classData = loadClassData(name);
if (classData == null) {
throw new ClassNotFoundException();
} else {
return defineClass(name, classData, 0, classData.length);
}
} catch (Exception e) {
throw new ClassNotFoundException(e.getMessage());
}
}
private byte[] loadClassData(String className) {
// 模拟从文件系统加载字节码
String path = className.replace('.', '/') + ".class";
try (InputStream is = getClass().getClassLoader().getResourceAsStream(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
if (is == null) return null;
int data;
while ((data = is.read()) != -1) {
baos.write(data);
}
return baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
代码说明:
`MyClassLoader`重写`findClass`方法
直接加载指定的类字节码
而没有遵循双亲委派模型
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


