类加载器
概念
Java类加载器负责将编译好的Java class文件加载到JVM中的运行时数据区域,供执行引擎调用。
分类
- 启动类加载器:BootClassLoader
- 扩展类加载器:ExtClassLoader -> PlatFromClassLoader(JDK1.9后)
- 应用类加载器:AppClassLoader
启动类加载
Java虚拟机启动后创建的第一个类加载器,由C++语言实现,所以再Java代码中查看其信息时,均为null。
加载路径:$JAVA_HOME/jdk1.8/jre/lib
扩展类加载器
由启动类加载器加载,并将扩展类加载器中parent的值置为null,表示指向启动类加载器,同时继承URLClassLoader。
加载路径:$JAVA_HOME/jdk1.8/jre/ext
系统类加载器
由启动类加载器加载,并将系统类加载器中的parent的值置为扩展类加载器,同时继承URLClassLoader
加载路径:classpath
双亲委派机制
JVM加载class类文件到虚拟机时,默认首先采用系统类加载器去加载用到的class类,采用的是双亲委托加载机制。
所谓双亲委托,顾名思义,就是当前类加载器(以系统类加载器为例)在加载一个类时,委托给其双亲(注意这里的双亲指的是类加载器中parent属性指向的类加载器)先进行加载。
双亲类加载器在加载时同样委托给自己的双亲,如此反复,直到某个类加载器没有双亲为止(通常情况下指双亲为null,也即为当前的双亲为扩展类加载器,其parent为启动类加载器),然后开始在依次在各自的类路径下寻找、加载class类
其他
class文件生成jar文件命令
jar -cvf xxx.jar xxx.class xxx.class ...