谈一谈Java类加载相关的方方面面
什么是类加载器
【谈一谈Java类加载相关的方方面面】类加载器就是将类的描述加载到虚拟机内存的这样一个模块;典型的类的描述就是java源码编译后的class文件,也可以是其他任何数据形式,比如网络字节流等;
类加载器有哪些
java默认定义了三种类加载器:
- 启动类加载器(Bootstrap Class-Loade)主要加载jre/lib下面的jar包
- 扩展类加载器(Extension or Ext Class-Loader)主要加载jre/lib/ext/目录下的jar包;(jre/lib/ext/目录可以通过指定的java.ext.dirs覆盖)
- 应用类加载器(Application or App Class-Loader),加载 classpath 的内容(classPath是一组目录组合)。
一般在需要改变双亲委派模型的时候会这么做;关于双亲委派模型,看下文;
类加载器的双亲委派模型 什么是双亲委派模型
当类加载器(Class-Loader)试图加载某个类型的时候,除非父加载器找不到相应类型,否则尽量将这个任务代理给当前加载器的父加载器去做。使用委派模型的目的是避免重复加载 Java 类型
为什么采用双亲委派模型
采用双亲委派模型主要出于两点考虑:
- 保证类的唯一性,一个类只被加载一次,避免重复加载;(因为在JVM规范里面,同一个class文件被两个相同的类加载,会被视为两个类)
- 安全性,保证java核心API不被替换;也就是启动类加载器加载过的类不会被其他类加载器覆盖;
- JNDI服务
- Tomcat服务器
- OSGI实现热更新
类加载的过程 类加载主要分为三个过程,加载、链接、初始化;
加载:Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象)
链接:这是核心的步骤,简单说是把原始的类定义信息平滑地转化入 JVM 运行的过程中。具体又细分为验证、准备、解析三个过程;
- 验证:验证Class对象是否符合虚拟机规范
- 准备:创建静态变量并准备内存空间
- 解析:将常量池中的符号引用修改为直接引用
自定义类加载器有哪些应用场景
- 修改类的字节码逻辑,比如:为外部类统一织入通用逻辑;``
- 根据用户需求,动态的创建类;比如:JDBC的驱动类,不同数据库需要使用不同的驱动类
- 包名+类名有冲突的时候,一个类加载器不能同时加载,可以用不同的类加载器加载到内存中;
- 热更新特性,通过自定义类加载器,实现在运行过程中动态的加载、卸载类
public class CustomClassLoader extends ClassLoader {
@Override
public Class findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassFromFile(name);
//这里是核心逻辑
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassFromFile(String fileName){
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(
fileName.replace('.', File.separatorChar) + ".class");
byte[] buffer;
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
int nextValue = https://www.it610.com/article/0;
try {
while ( (nextValue = inputStream.read()) != -1 ) {
byteStream.write(nextValue);
}
} catch (IOException e) {
e.printStackTrace();
}
buffer = byteStream.toByteArray();
return buffer;
}
}
小结 今天跟大家分享了java类加载器的以下知识:
- 什么是类加载器
- 类加载器具体有哪些
- 类加载过程中的双亲委派模型
- 类加载的具体过程
- 自定义类加载器的应用场景
- 类加载器的实现
推荐阅读
- 程序员|android面试题2019!一线互联网移动架构师筑基必备技能之Java篇,聪明人已经收藏了!
- Java基础|Java8 -- Lambda表达式
- Java并发编程 - 线程
- Java面试题整理|历时两个月拿到阿里P7整个面试过程和offer(仅供参考)
- java基础|java基础知识——(this,super关键字)
- JAVA笔记|Java——this关键字
- JAVA笔记|Java——super关键字
- Java——继承中this和super关键字的使用
- JAVA——this、super关键字
- JavaSE基础学习|Java基础——this关键字与super关键字