avatar

类加载器

1.类加载器的概述

负责将.class文件加载到内存中,并为之生成对应的Class对象。我们的最终目标是学习类加载器的加载机制,了解这个机制我们就能更好的理解程序的运行。

2.类加载器的分类

Bootstrap ClassLoader 根类加载器

Extension ClassLoader 扩展类加载器

Sysetm ClassLoader 系统类加载器

3.类加载器的作用

1.Bootstrap ClassLoader 根类加载器,也被称为引导类加载器,负责Java核心类的加载,比如System,String等。在JDK中jre的lib目录下rt.jar文件中

2.Extension ClassLoader 扩展类加载器负责JRE的扩展目录中jar包的加载。在JDK中JRE的lib目录下ext目录

3.Sysetm ClassLoader 系统类加载器(又叫做Application ClassLoader)负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径

1

4.类加载器原理

父类委托机制:先让父类加载器寻找,只有在父类加载器找不到的情况下才从自己的类路径中去寻找

举例

​ 比如当我们执行java Dog的时候,肯定要先加载Dog.class,本来这个类应该由System Classloader加载,但是这个类加载有父亲,所以就交给Extension Classloader类加载器加载,这个类加载器还有爸爸最后就交给BootStrap Classloader去加载。但是BootStrap 类加载器加载的rt.jar包中并没有这个Dog类,无法加载,就又返回给Extension 类加器加载,这个类加载器在ext目录也找不到Dog类,就又返回给System类加器加载器,如果从classpath目录找到了Dog类就加载,找不到就报错ClassNotFoundException

2

5.自定义类加载器

步骤

第一步:编写类继承ClassLoader

第二步:编写方法(功能把指定位置的class文件转换成Class对象)

第三步:生成构造方法

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MyClassLoader extends ClassLoader{
public MyClassLoader(String name, ClassLoader parent) {
super(name, parent);
}

public MyClassLoader(ClassLoader parent) {
super(parent);
}

public MyClassLoader() {
}

/**
* 功能:传入一个.class文件的绝对路径,然后生成对应的Class对象
* @param file
* @return
* @throws Exception
*/
public Class load(String file)throws Exception{
//1.先把xxx.class文件读取到一个字节数组中
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[1024*8];
int len = fis.read(data);
//2.调用defineClass将字节数组转换成Class对象
Class<?> clazz = super.defineClass(null, data, 0, len);
return clazz;
}
}

测试代码

1
2
3
4
5
6
public class T {
public static void main(String[] args) throws Exception{
Class clazz = new MyClassLoader().load("C:\\Users\\haoyongliang\\Desktop\\Student.class");
System.out.println(clazz.getSimpleName());
}
}
文章作者: 微信:hao_yongliang
文章链接: https://haoyongliang.gitee.io/2019/07/09/javaSE/%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 郝永亮的主页
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论