一.什么是Java类加载
开发JavaWeb应用,编译器会把写好的源代码(*.java)编译成可执行文件(*.class),程序运行的时候虚拟机(JVM)会将这些可执行文件从磁盘加入内存中,这个过程就是类加载。
二.java类加载器
主要作用就是加载.class文件。
java中类加载器主要分为两类。
1.JDK提供的类加载器。
2.自定义加载器。
JDK提供的类加载器
1.bootStrapClassLoader
启动类加载器,加载JVM自身需要的核心类库,类的加载是通过C语言实现,
加载目录:<JAVA_HOME>/lib
路径下的核心类库或-Xbootclasspath
参数指定的路径下的jar包
Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类
2.extensionClassLoader
扩展类加载器,由Java语言实现的,是Launcher的静态内部类,
加载目录:<JAVA_HOME>/lib/ext
目录下或者由系统变量-Djava.ext.dir指定位路径中的类库,开发者可以直接使用标准 扩展类加载器。
3.appClassLoader
系统加载器,它负责加载系统类路径java -classpath
或-D java.class.path
指定路径下的类库,也就是我们经常用到 的classpath路径。
类加载加载方式:
1.隐式加载:通过new方式创建的对象会隐式的通过类加载器加载类到JVM中
2.动态加载:通过class.forName(),显示加载(反射机制)。
加载时机:
程序启动时JVM只会把JVM所需的部分类加入内存中,其他类在需要使用的时候才会通过加载器加入内存中,
节省了内存的开销。
加载原则:
1.双亲委派原则
2.单一加载原则
3.可见性
要将一个类加载到JVM中,需要用种类加载器进行加载?
当类加载器想要将一个类加载到内存中,首先会请求父类加载器加载,如果父类加载器还有父类加载器,就请求顶级父类加载器,进行加载,如果父类加载器们都无法加载的话,才会使用自身加载器进行加载。如果不行就向下传递委托任务,由其子类加载器进行加载。
好处:避免重复加载。(一个加载器只会加载类一次)
加载过程
1.加载:查找导入.class文件
2.链接:
1.验证:检查.class文件数据正确性
2.准备:给类的静态变量分配使用空间
3.解析:将符号引用转成直接引用
3.初始化:对静态变量,静态代码块进行初始化
自定义加载器:
1.继承java.lang.ClassLoader
2.重写父类的findClass方法 (就是找.class文件的位置)