Java类加载器

简介: Java类加载器

1、类加载器


作用:负责将.class文件(存储的物理文件)加载在到内存中


801edb66c7207f8563d6026c9ac8483a_1c317eed505048ff8d82e34ec1227407.png


2、类加载的过程


2.1、类加载时机


创建类的实例(对象)

调用类的类方法

访问类或者接口的类变量,或者为该类变量赋值

使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

初始化某个类的子类

直接使用java.exe命令来运行某个主类


2.2、类加载过程


加载


通过包名 + 类名,获取这个类,准备用流进行传输

在这个类加载到内存中

加载完毕创建一个class对象


3f0e2b773412018bf241d39f4fa6ea57_03ade19b58bf49a4821a9116520a73d0.png


链接


验证


确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全


(文件中的信息是否符合虚拟机规范有没有安全隐患)


f68e019d39940c120b13b2b131506d8e_0594356c05f9465da3d909534ef7a9cf.png


准备


负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值


(初始化静态变量)


6c898980c2fef1e312589e6f956c1346_c7d5ce10efba4d92a08b189c5a9c22d9.png


解析


将类的二进制数据流中的符号引用替换为直接引用


(本类中如果用到了其他类,此时就需要找到对应的类)


5d16540375de86e4ed06b44788d844ce_26a6b6e68a3646b5a67cad04e8e16368.png


初始化


根据程序员通过程序制定的主观计划去初始化类变量和其他资源


(静态变量赋值以及初始化其他资源)


fee3c74733ec24f031ff217838b464e6_6d3986dbe055465b8a3c76a8758e3372.png


小结


当一个类被使用的时候,才会加载到内存

类加载的过程: 加载、验证、准备、解析、初始化


3、类加载的分类


分类


Bootstrap class loader:虚拟机的内置类加载器,通常表示为null ,并且没有父null

Platform class loader:平台类加载器,负责加载JDK中一些特殊的模块

System class loader:系统类加载器,负责加载用户类路径上所指定的类库

类加载器的继承关系


System的父加载器为Platform

Platform的父加载器为Bootstrap

代码演示


public class ClassLoaderDemo1 {
    public static void main(String[] args) {
        //获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        //获取系统类加载器的父加载器 --- 平台类加载器
        ClassLoader classLoader1 = systemClassLoader.getParent();
        //获取平台类加载器的父加载器 --- 启动类加载器
        ClassLoader classLoader2 = classLoader1.getParent();
        System.out.println("系统类加载器" + systemClassLoader);
        System.out.println("平台类加载器" + classLoader1);
        System.out.println("启动类加载器" + classLoader2);
    }
}



4、双亲委派模型


介绍


如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式


12f3ec96b6de9faec092f840b1584311_25a66cab40844ec6a1050f6c946f82c1.png


5、详解ClassLoader


方法介绍


方法名

说明

public static ClassLoader getSystemClassLoader()

获取系统类加载器

public InputStream getResourceAsStream(String name)

加载某一个资源文件

// static ClassLoader getSystemClassLoader() 获取系统类加载器

// InputStream getResourceAsStream(String name)  加载某一个资源文件


6、使用类加载器读取配置文件信息


示例代码


public class ClassLoaderDemo {
  public static void main(String[] args) throws IOException {
      // 获取系统类加载器
      ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
      // 利用加载器去加载一个指定的文件
      // 参数:文件的路径(放在src的根目录下,默认去那里加载)
      // 返回值:字节流。
      InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
      Properties prop = new Properties();
      prop.load(is);
      System.out.println(prop);
      is.close();
  }
}
相关文章
|
5月前
|
前端开发 Java API
类加载器“如果我定义了一个类名与Java核心类类名相同,那它还能被加载吗?”
类加载器“如果我定义了一个类名与Java核心类类名相同,那它还能被加载吗?”
|
5月前
|
前端开发 Java 编译器
Java面向对象高级【类加载器】
Java面向对象高级【类加载器】
|
前端开发 Java
01Java基础 - 类加载器
01Java基础 - 类加载器
45 0
|
安全 前端开发 Java
Java 类加载器详解
在Java编程中,类加载器(Class Loader)是一个重要的概念,它负责将类加载到Java虚拟机中,使程序能够正常运行。本文将详细解释Java类加载器的工作原理、不同类型的类加载器以及如何自定义类加载器。
103 0
|
Java 应用服务中间件
《深入理解java虚拟机》——Tomcat类加载器体系结构
《深入理解java虚拟机》——Tomcat类加载器体系结构
|
2月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
45 0
|
2月前
|
安全 前端开发 Java
【JVM 探秘】ClassLoader 类加载器:揭秘 Java 类加载机制背后的秘密武器!
【8月更文挑战第25天】本文全面介绍了Java虚拟机(JVM)中的类加载器,它是JVM的核心组件之一,负责将Java类加载到运行环境中。文章首先概述了类加载器的基本工作原理及其遵循的双亲委派模型,确保了核心类库的安全与稳定。接着详细阐述了启动、扩展和应用三种主要类加载器的层次结构。并通过一个自定义类加载器的例子展示了如何从特定目录加载类。此外,还介绍了类加载器的完整生命周期,包括加载、链接和初始化三个阶段。最后强调了类加载器在版本隔离、安全性和灵活性方面的重要作用。深入理解类加载器对于掌握JVM内部机制至关重要。
105 0
|
3月前
|
存储 前端开发 Java
(二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器
上篇《初识Java虚拟机》文章中曾提及到:我们所编写的Java代码经过编译之后,会生成对应的class字节码文件,而在程序启动时会通过类加载子系统将这些字节码文件先装载进内存,然后再交由执行引擎执行。本文中则会对Java虚拟机的类加载机制以及执行引擎进行全面分析。
|
5月前
|
监控 安全 Java
JVM工作原理与实战(十):类加载器-Java类加载器
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了扩展类加载器、通过扩展类加载器去加载用户jar包、应用程序类加载器等内容。
99 4
|
12月前
|
Java
【面试题精讲】JVM-类加载器-Java中的默认类加载器
【面试题精讲】JVM-类加载器-Java中的默认类加载器