一、什么是类加载器
- 类加载器ClassLoader就是将我们的.class文件转换成Class对象。类Class只有被加载到jvm中后才能运行,jvm会将编译生成的字节码.class文件加载到内存中,组织成一个完整的java应用程序,这个过程是由类加载器ClassLoader和它的子类来完成的。
二、jvm中的类加载器
jvm中有三个类加载器:
- 1、引导类加载器:BootStrap,它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader
- 2、扩展类加载器:ExtClassLoader,它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
- 3、应用类加载器:AppClassLoader,它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的
可以通过类名.class.getClassLoader();获取类加载器
例如:
ClassLoader classLoader = AESCipher.class.getClassLoader();
System.out.println(classLoader);//结果:sun.misc.Launcher$ExtClassLoader@1c78e57
ClassLoader classLoader = Demo1.class.getClassLoader();
System.out.println(classLoader);//结果:sun.misc.Launcher$AppClassLoader@6b97fd
三、类加载器的机制
类加载器的的机制是全盘负责委托机制
- 全盘负责:
只要有一个类加载器对当前的.class文件进行了转换Class对象的过程,那么关于这个类所有类都是由这个类加载器负责加载。 - 委托机制:
类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,是从父类加载器开始,如果父类加载器可以处理,子类就不处理;如果父类加载器不能处理,就由子类来处理加载。
四、类加载器的过程
- 1、类的加载阶段是将class文件中的二进制数据读取到内存中,然后将该字节流所代表的静态存储结构转化为方法区中运行时的数据结构,并且在堆内存中生成该类的java.lang.class对象,作为方法区数据结构的入口。类加载器的最终产物是堆内存中的class对象,类加载器提供cache机制,就是说如果.class文件已经加载为Class对象,cache中已经存在就不会在生成,直接从cache中获取。
- 2、加载过程:
(1)验证:
验证的主要目的是确保class文件的字节流所包含的内容符合jvm规范,并且不会出现危害jvm自身安全的代码;
(2)准备:
准备阶段主要做的事情是在方法区为静态变量配备内存已经赋值默认初始值;
(3)解析:
解析就是在常量池中寻找类、接口、字段和方法的符号引用,并将这些符号引用替换成直接引用的过程;
本文详细介绍了Java中的类加载器,包括引导类加载器、扩展类加载器和应用类加载器,以及它们在加载类时的角色。类加载器遵循全盘负责和委托机制,确保类的正确加载。此外,还阐述了类加载的过程,包括验证、准备和解析等阶段,确保类的安全性和有效组织。

被折叠的 条评论
为什么被折叠?



