java类加载相关知识总结
作者:code_greenhand 时间:2023-10-19 13:31:57
类加载器
类加载器作用
负责将.class文件(存储的物理文件)加载到内存中
类加载器过程
加载:通过全类名获取这个类准备用流传输,加载进内存,加载完毕创建一个Class对象
链接
验证:确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全
(文件中的信息是否符合虚拟机规范有没有安全隐患)准备:负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值
(初始化静态变量)解析:将类的二进制数据流中的符号引用替换为直接引用
(本类中如果用到了其他类,此时就需要找到对应的类)
初始化:根据程序员通过程序制定的主观计划去初始化类变量和其他资源(也就是自己写的构造函数初始化)
(静态变量赋值以及初始化其他资源)
类加载分类
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);
}
}
双亲委派模型
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式(一句话意思就是加载类先让父类的加载器去加载,如果父类加载不了就会重新向下让子类加载器依次去加载知道找到加载的类加载器)
ClassLoader 中的两个方法
方法介绍
方法名 | 说明 |
public static ClassLoader getSystemClassLoader() | 获取系统类加载器 |
public InputStream getResourceAsStream(String name) | 加载某一个资源文件 |
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Demo {
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.getProperty("name"));
is.close();
}
}
来源:https://blog.csdn.net/qq_35426012/article/details/117136123
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SpringBoot实现过滤器拦截器的耗时对比
![](https://img.aspxhome.com/file/2023/6/83456_0s.png)
C#编程获取各种电脑硬件信息的方法示例
Java由浅入深带你了解什么是包package
![](https://img.aspxhome.com/file/2023/4/76594_0s.png)
java使用归并删除法删除二叉树中节点的方法
JVM教程之内存管理和垃圾回收(三)
![](https://img.aspxhome.com/file/2023/2/59352_0s.jpg)
@GrpcServise 注解的作用和使用示例详解
Java使用RedisTemplate模糊删除key操作
java中的GC收集器详情
![](https://img.aspxhome.com/file/2023/2/67002_0s.png)
Android UI效果之绘图篇(四)
![](https://img.aspxhome.com/file/2023/2/126692_0s.png)
详解android 中animation-list 动画的应用
spring boot org.junit.jupiter.api不存在的解决
![](https://img.aspxhome.com/file/2023/6/83596_0s.png)
C#实现字体旋转的方法
SpringBoot JPA使用配置过程详解
SpringCloud Zuul过滤器和谷歌Gauva实现限流
![](https://img.aspxhome.com/file/2023/5/125225_0s.png)
Android自定义View原理(实战)
![](https://img.aspxhome.com/file/2023/1/139271_0s.png)
Java创建线程的两种方式
Java 中Flyway的使用详解
![](https://img.aspxhome.com/file/2023/1/132451_0s.png)
mybatis中sql语句CDATA标签的用法说明
SpringBoot集成EasyExcel的应用场景分析
![](https://img.aspxhome.com/file/2023/6/78876_0s.png)