从类加载器到双亲委派模式。

双亲委派模式的英文叫做Parents Delegation Model。

自己写的Java类需要经过编译类加载这两个过程。

在加载某个类的时候,会将查询和加载委派给父加载器。如果父加载器都无法加载,则尝试自己加载。

有两个好处,一个是安全。

类加载器

在Java中,类加载器(Class Loader)是一个重要的概念,它负责将Java字节码文件加载到内存中,并生成对应的Java类。在Java虚拟机(JVM)中,每个类加载器都有自己的加载范围和优先级,通常情况下会根据类的名称和路径进行查找和加载,确保类的唯一性和正确性。

Java虚拟机提供了三种类加载器:

  • 引导类加载器(Bootstrap Class Loader):负责加载Java平台核心类库。
  • 扩展类加载器(Extension Class Loader):负责加载Java平台扩展库。
  • 应用程序类加载器(Application Class Loader):负责加载应用程序类和第三方类库。

除了JVM提供的默认类加载器之外,还可以通过自定义类加载器来实现特定的类加载行为,例如从网络或数据库中加载类等。自定义类加载器通常继承自java.lang.ClassLoader类,并重写findClass()方法实现类的查找和加载。


双亲委派模式

双亲委派模式(Parent-Delegate Model)是 Java 类加载器(ClassLoader)在加载类时所采用的一种设计模式。这种模式的核心思想是:当一个类加载器收到类加载请求时,首先不会尝试自己加载这个类,而是将请求委派给其父类加载器。依次递归,直到最顶层的启动类加载器(Bootstrap ClassLoader);如果父类加载器无法加载该类,子类加载器才尝试自己去加载。

  • 避免类的重复加载:通过委派给父类加载器加载类,可以确保同一个类不会被多个类加载器重复加载。这有助于节省内存资源,并确保类之间的互操作性。
  • 保护 Java 核心类库:由于双亲委派模式的存在,用户自定义的类加载器无法直接加载 Java 核心类库(如java.lang.Object等)。这有助于确保 Java 核心类库的安全性,防止恶意代码篡改或破坏Java核心类。
  • 维护类加载器的层次结构:双亲委派模式使得各级类加载器可以按照一定的层次结构来组织和管理。这有助于降低类加载器的复杂性,简化类加载过程。

Java各个版本发布时间和主要特性整理!

文档地址:JDK Release Notes (oracle.com)

Java SE 1.0:

1996年1月23日

  • Java语言的初始版本

Java SE 1.1:

1997年2月19日

  • 内部类、JavaBeans、RMI和JAR文件的支持

Java SE 1.2(Java 2):

1998年12月8日

  • 改进了JVM性能、Swing用户界面工具包和Java插件

Java SE 1.3:

2000年5月8日

  • HotSpot虚拟机、Java Sound API和JNDI(Java命名和目录接口)的引入

Java SE 1.4:

2002年2月6日

  • 增加了正则表达式、XML解析、Java Web Start和Java NIO(新I/O)等特性

Java SE 5.0(Java 5):

2004年9月30日

  • 泛型、自动装箱/拆箱、枚举、注解和for-each循环等特性的引入

Java SE 6(Java 6):

2006年12月11日

  • 更快的JVM、JDBC 4.0和Web服务的支持

Java SE 7(Java 7):

2011年7月28日

  • 改进了JVM性能、自动资源管理、泛型实例化类型推断和新的文件系统API等

Java SE 8(Java 8):

2014年3月18日,LTS长期支持版本。支持期限:自发布日期起至2025年12月

  • Lambda 表达式:简化函数式编程。允许以更简洁的语法编写函数式接口的实例,使代码更加简洁。
  • Stream API:用于处理集合,支持函数式操作,如过滤、映射和聚合。
  • 方法引用:允许直接引用现有方法或构造函数,避免了重复编写类似的代码。
  • 接口的默认方法:在接口中提供默认实现,提高接口的灵活性。
  • 时间 API:提供了一组强大的时间操作类,简化了日期和时间的操作。
  • 重复注解:允许在同一个地方多次声明同一个注解,提高了代码的可读性。
  • CompletableFuture 类:简化异步编程,提供更好的错误处理和异常处理机制。
  • Nashorn 引擎:提供了一种基于 JavaScript 的解决方案,允许将 JavaScript 代码嵌入到 Java 应用程序中。
  • Optional 类:减少空指针异常,提高代码可读性。

JDK 8 Update Release Notes (oracle.com)

Java SE 9(Java 9):

2017年9月21日

  • 模块系统(Project Jigsaw):将 Java 的庞大代码库划分为可重用的模块,简化大型应用的构建和维护。
  • JShell:Java 的交互式命令行工具,用于快速尝试和测试 Java 代码片段。
  • 新的集合工厂方法:方便地创建不可变集合,如 List.of()、Set.of() 和 Map.of()。

Java Development Kit 9 Update Release Notes (oracle.com)

Java SE 10(Java 10):

2018年3月20日

  • 局部变量类型推断:使用 var 关键字自动推断局部变量的类型,简化代码。
  • 垃圾收集器接口改进:提高了垃圾收集器的可插拔性和灵活性。

Java Development Kit 10 Update Release Notes (oracle.com)

Java SE 11(Java 11):

2018年9月25日,LTS长期支持版本。支持期限:自发布日期起至2026年9月:

  • 新的 HTTP 客户端 API:支持 HTTP/2 和 WebSocket,提供了更现代化的编程方式。
  • 改进的垃圾收集:引入了 ZGC 和 Epsilon 垃圾收集器。
  • String 类的新方法:如 lines()、isBlank()、strip() 等。

Java Development Kit 11 Release Notes (oracle.com)

Java SE 12(Java 12):

2019年3月19日

  • switch 表达式:允许在 switch 语句中使用表达式,提高了代码的可读性和简洁性。
  • 改进的字符串类:提供了一些新的方法,使得字符串的操作更加方便和高效。
  • Shenandoah 垃圾回收器:提供了一种低停顿时间的垃圾回收器,适用于大型堆内存的应用程序。
  • 微基准测试套件:提供了一种用于快速测试性能的微基准测试框架。
  • JDK 源代码重构:对 JDK 源代码进行了重构,提高了代码的可读性和维护性。

Java Development Kit 12 Update Release Notes (oracle.com)

Java SE 13 (Java 13):

2019年9月17日

  • 文本块:允许以更简洁的语法创建多行字符串,提高了代码的可读性和简洁性。
  • 改进的 switch 表达式:允许在 switch 语句中使用表达式,提供更好的类型推断和更灵活的写法。
  • ZGC 垃圾回收器改进:提高了 ZGC 垃圾回收器的性能和可靠性。
  • 应用程序类数据共享改进:提高了应用程序类数据共享的性能和效率。

Java Development Kit 13 Update Release Notes (oracle.com)

Java SE 14 (Java 14):

2020年3月17日

  • instanceof 模式匹配:允许在 instanceof 操作符中使用模式匹配,提高了代码的简洁性和可读性。
  • Records 类:提供了一种更简单和安全的数据类的定义方式。
  • Switch 表达式增强:允许使用箭头操作符(->)作为 lambda 表达式的简写语法。
  • 文本块增强:允许在文本块中使用嵌入式表达式,使得文本块更加灵活和强大。
  • 改进的 NullPointerException 信息:提供更详细的 NullPointerException 信息。

Java Development Kit 14 Update Release Notes (oracle.com)

Java SE 15 (Java 15):

2020年9月15日

  • 隐式的类文件:允许在 Java 源代码中定义多个类,而不需要单独的类文件。
  • 改进的文本块:允许在文本块中使用转义字符和 Unicode 转义,提高了文本块的灵活性和可读性。
  • 改进的 switch 表达式:允许在 switch 语句中使用多个匹配项,提供更灵活的写法。
  • Sealed 类和接口:允许控制哪些类或接口可以继承或实现该类或接口,提高了代码的安全性和可维护性。
  • 其他改进:包括增强的 ZGC 垃圾回收器、改进的内存管理、新增的 Unix 域套接字 API 等。

Java Development Kit 15 Release Notes (oracle.com)

Java SE 16 (Java 16):

2021年3月16日

  • 增强的文本块:允许在文本块中使用转义字符和嵌入式表达式。
  • 移除了废弃的 ParallelScavenge 垃圾回收器。
  • 改进的 ZGC 垃圾回收器:提高了性能和可靠性,增加了可配置参数。
  • Records 类的增强:允许在 records 类中添加静态方法和私有构造函数。
  • Vector API:提供了一种新的 API,用于高效地执行矢量化操作。

Java Development Kit 16 Release Notes (oracle.com)

Java SE 17(Java 17):

2021年9月14日,LTS长期支持版本。支持期限:自发布日期起至2029年9月

  • 嵌套枚举:允许在类和接口中定义嵌套枚举,提高了代码的可读性和简洁性。
  • 改进的 switch 语句:允许在 switch 语句中使用 case 标签作为表达式,提供更灵活的写法。
  • 预览性功能:包括模式匹配、嵌套枚举、记录类的序列化等新特性。
  • 增强的垃圾回收器:提高了性能和可靠性,增加了可配置参数。
  • 其他改进:包括新的内存管理和性能优化,增强的 JIT 编译器等。

Java Development Kit 17 Release Notes (oracle.com)