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`方法 直接加载指定的类字节码 而没有遵循双亲委派模型
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。