Java类加载器(ClassLoader)
2023-04-30 11:49:57 1 举报
AI智能生成
Java类加载器(ClassLoader) 思维导图
作者其他创作
大纲/内容
类加载的5个过程
加载
加载class文件
验证
验证class文件,确保虚拟机自身安全
文件格式验证
元数据验证
字节码验证
符号引用验证
准备
类变量分配内存并设置初始值(static修饰的字段)
static int i=5,这里只初始化为0,最后一步初始化时再赋值为5
不包含final,final字段在编译时已经赋值完毕
不包含实例变量,实例变量在java堆中
类变量分配在方法区中
解析
将常量池中的符号引用替换为直接引用的过程
初始化
初始化超类
执行静态初始化器
类变量初始化
四种类加载器
启动类加载器(Bootstrap)
加载JVM自身需要的类
用C++实现,是虚拟机的一部分
负责将<JAVA_HOME>/lib路径下的核心类或-Xbootclasspath参数指定的路径下的jar包加载到内存中
按照文件名识别加载jar包,如rt.jar
如果文件名不被虚拟机识别,丢到lib下也没用
只加载包名为java,javax,sun等开头的类
扩展类加载器(ExtClassLoader)
sun.misc.Launcher & ExtClassLoader
是Launcher的静态内部类,JAVA实现
加载<JAVA_HOME>/lib/ext目录 或-D java.ext.dir指定路径中的类
系统类加载器(AppClassLoader)
sun.misc.Launcher & AppClassLoader
加载java -classpath 或 -D java.class.path 指定路径下的类库,即 classpath路径
一般情况下默认使用该加载器
通过 classLoader#getSystemClassLoader() 方法可以获取到该类加载器
自定义类加载器
父类是AppClassLoader
一般继承URLClassLoade,不用自己写findClass()方法
显式加载与隐式加载
指的是jvm把class文件加载到内存的方式
显式加载:在代码中通过调用ClassLoader加载class对象
Class.forName(name)
this.getClass().getClassLoader().loadClass()
隐式加载:不直接在代码中调用ClassLoader的方法加载class对象,而是通过虚拟机自动加载到内存中
在加载某个类的class文件时,该类的class文件中引用了另外一个类的对象,此时额外引用的类将通过JVM自动加载到内存中
类和类加载器
两个Class是否是同一个类对象
包名必须一致
加载这个类的ClassLoader必须一致
需要覆盖loadClass()方法,否则同名类不会加载
可以用该特性实现热部署功能
双亲委派模型
除了顶层的启动类加载器,其余的类加载器都先尝试由父类加载器加载
组合关系,非继承关系
层级由低到高:自定义类加载器 -> 系统类加载器 -> 扩展类加载器 -> 启动类加载器
java 1.2 后引入
优势
Java类获得了带有优先级的层次关系
使用核心API包名编写自定义类,加载时会报异常
java.lang.SecurityException: Prohibited package name: xxx
双亲委派模型的破坏者
线程上下文类加载器
通过java.lant.Thread类中的getContextClassLoader() 和 setContextClassLoader(ClassLoader cl) 方法来获取和设置线程的上下文类加载器
如果没有手动设置上下文类加载器,线程将继承其父线程的上下文类加载器
初始线程的上下文类加载器是系统类加载器(AppClassLoader)
子主题 4
0 条评论
下一页