什么是类加载的委派模型?

简介

Java语言采用的是基于类的面向对象编程思想,当Java程序需要使用一个类时,它会根据类的名称来寻找对应的字节码文件,并将字节码文件加载到JVM中。类加载的委派模型是指,当Java程序需要加载一个类时,先委派父类加载器去加载该类,如果父类加载器无法加载该类,则交给当前类加载器自行加载。

工作原理

类加载的委派模型是Java虚拟机(JVM)用来保证Java核心api不被篡改的重要机制之一。在JVM创建时,会设置一个系统类加载器,所有其他的类加载器都是由系统类加载器创建的。类加载器按照父子关系形成了一个树形结构,每个类加载器实例都有一个指向其父类加载器实例的引用。

在实际加载一个类时,JVM会依次将该任务委派给当前线程的父类加载器实例去完成。如果父类加载器可以成功加载该类,加载过程结束。如果父类加载器无法完成加载任务,则将任务转交给他的父类加载器,直到顶层的启动类加载器为止。如果启动类加载器依然找不到要加载的类,则会抛出ClassNotFoundException异常。

这个过程中,一个类被加载时,本质上只是其对应的.class文件被读取到了JVM中,并在JVM的内存区域中生成一个代表该类的Class对象,这个Class对象对于JVM来说是唯一的,即同一个类被加载多次,JVM都只会为其生成一个Class对象。

示例

示例1:

示例代码:

public class MyClassLoader {
    public static void main(String[] args) {
        //获取系统类加载器
        ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println("系统类加载器:" + appClassLoader);

        //获取系统类加载器的父类加载器——扩展加载器
        ClassLoader extensionClassLoader = appClassLoader.getParent();
        System.out.println("扩展类加载器:" + extensionClassLoader);

        //获取扩展类加载器的父类加载器——启动类加载器
        ClassLoader bootstrapClassLoader = extensionClassLoader.getParent();
        System.out.println("启动类加载器:" + bootstrapClassLoader);
    }
}

该示例代码输出:

系统类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@2b193f2d
扩展类加载器:jdk.internal.loader.ClassLoaders$PlatformClassLoader@1f96302d
启动类加载器:null

示例2:

示例代码:

public class ClassLoaderDemo {
    public static void main(String[] args) throws Exception {
        // 获取一个系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        // 通过系统类加载器加载一个类
        Class<?> clazz = systemClassLoader.loadClass("java.lang.String");
        // 打印该类的类加载器——因为是由系统类加载器加载的,所以输出是AppClassLoader
        System.out.println("类加载器:" + clazz.getClassLoader());
    }
}

该示例代码输出:

类加载器:jdk.internal.loader.ClassLoaders$AppClassLoader@2b193f2d

总结

类加载器的委派模型是Java虚拟机保证api被加载时不被篡改的重要机制之一。在使用ClassLoader类加载器加载类时,其实是按照委派模型去执行,在每次委派给父ClassLoader加载类时,都会先到其父ClassLoader中查找是否已经加载。这种机制避免了类名相同但来源不同的类出现混乱,从而保证了Java程序的安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是类加载的委派模型? - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • JDBCTM 指南:入门3 – DriverManager

    下面是详细讲解“JDBCTM 指南:入门3 – DriverManager”的完整攻略。 JDBCTM 指南:入门3 – DriverManager 在本文中,我们将介绍JDBC中的DriverManager类,它是Java SQL API的一个基本组件,用于管理数据库驱动程序。 什么是 DriverManager DriverManager是Java提供的…

    Java 2023年6月16日
    00
  • 详解SpringBoot之集成Spring AOP

    下面是详解SpringBoot之集成SpringAOP的完整攻略: 什么是Spring AOP Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块。它实现了基于代理的AOP,并且与IOC容器无缝集成,提供了便捷的配置方式。 面向切面编程就是将通用的横切关注点(如日志、安全、事务等)从…

    Java 2023年5月15日
    00
  • Myeclipse中hibernate自动创建表的方法

    下面是MyEclipse中Hibernate自动创建表的方法的完整攻略。 准备工作 在MyEclipse中安装Hibernate插件 在MyEclipse中创建Java工程 导入Hibernate相关的jar包 配置Hibernate的配置文件hibernate.cfg.xml 使用Hibernate自动创建表 在实体类中添加@Table、@Column等注…

    Java 2023年5月20日
    00
  • Java在长字符串中查找短字符串的实现多种方法

    下面我会详细讲解Java在长字符串中查找短字符串的实现多种方法。 目录 需求背景 传统字符串查找方式 String类的indexOf方法 Pattern类的matcher方法 优化的字符串查找方式 Boyer-Moore算法 KMP算法 总结 需求背景 在Java程序中处理长字符串时,经常需要进行短字符串的查找。例如,在字符串中查找单词、检查字符串中是否包含…

    Java 2023年5月26日
    00
  • Java Pattern和Matcher字符匹配方式

    Java Pattern和Matcher字符匹配方式 在Java中,我们可以使用正则表达式来进行字符串匹配和替换等操作。其中,java.util.regex.Pattern类和java.util.regex.Matcher类是我们非常常用的两个类。 Pattern类 Pattern类提供了编译正则表达式的方法,例如: Pattern pattern = Pa…

    Java 2023年5月23日
    00
  • Sprint Boot @PostMapping使用方法详解

    @PostMapping是Spring Boot中的一个注解,它用于将HTTP POST请求映射到控制器方法上。在使用Spring Boot开发Web应用程序时,@PostMapping是非常重要的。本文将详细介绍@PostMapping的作用和使用方法,并提供两个示例说明。 @PostMapping的作用 @PostMapping的作用是将HTTP POS…

    Java 2023年5月5日
    00
  • Java中IO流解析及代码实例

    Java中IO流解析及代码实例 什么是IO流? 在计算机的世界里,I/O就是指input/output,表示输入和输出,是计算机和外部世界交互的一种方式。 Java中IO流,就是指为了方便对这种输入输出进行操作而引入了一些类和接口,通常分为字节流和字符流两种类型。 字节流和字符流的区别在于数据的单位不同:字节流以字节为单位进行读写,可以用于读写所有类型的文件…

    Java 2023年5月23日
    00
  • Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常

    针对该异常,以下是完整的攻略解释: 1. 异常描述 Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type 异常表示在运行时,JVM无法找到org.objectweb.asm.Type类,导致产生了这个异常。最常见的原因就是缺少相关的jar包或者依赖。 2. 解决方式 解决该异常…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部