ClassLoader类加载器
JAVA类装载方式,有两种:
1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。
2.显式装载, 通过
class.forname()等方法,显式加载需要的类
java类装载器
1.Bootstrp loader
Bootstrp加载器是用
C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载
%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。
2.ExtClassLoader
Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器
设置为Bootstrp loader.ExtClassLoader是用Java写的,具体来说就是
sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,
此路径下的所有classes目录以及java.ext.dirs系统变量指定的路径中类库。
3.AppClassLoader
Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,
并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader
也是用Java写成的,它的实现类是 sun.misc.Launcher$AppClassLoader,
另外我们知道ClassLoader中有个getSystemClassLoader方法,
此方法返回的正是AppclassLoader.AppClassLoader主要负责
加载classpath所指定的位置的类或者是jar文档,它也是Java程序默认的类加载器。
描述一下
JVM加载class文件的原理机制
1、装载:查找和导入Class文件
2、链接:其中
解析步骤是可以选择的 (a)检查:检查载入的class文件数据的正确性 (b)准备:给类的静态变量分配存储空间 (c)解析:将符号引用转成直接引用
3、初始化:对静态变量,静态代码块执行初始化工作
NoClassDefFoundError
异常
ClassNotFoundException
//类加载
public class Loading {
private static Loading obj = new Loading();
//private static Loading obj = null;
private static int value1;
private static int value2 = 0; //初始化阶段又赋值了
public Loading() {
value1 = 8;
value2 = value1;
System.out.println("before value1="+value1);
System.out.println("before value2="+value2);
}
public static void main(String[] args) {
//obj = new Loading();
System.out.println("after value1="+value1);
System.out.println("after value2="+value2); //初始化阶段又赋值了
}
static {
System.out.println("static {}..");
}
{
System.out.println("
instance {}..");
}
}