Java中双亲委派模型指什么及用途?

欣喜 Java教程 发布时间:2025-03-20 10:43:15 阅读数:153 1
下文笔者讲述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`方法
	   直接加载指定的类字节码
	    而没有遵循双亲委派模型
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202503/8381.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者