1.什么是java类的加载
java 类的加载是由虚拟机来完成的。简单来说就是java虚拟机可以多各种途径(比如硬盘,网络)等将class文件加载到内存的一个过程。其中这个加载过程可以划分成几个阶段:加载,连接,初始化,使用,卸载;每个过程都有自己必须完成的职责。从java api 上来讲就是将class文件 转换成相对应的Class对象
2.java类的加载与使用过程图:
3.加载过程
3.1查找并加载类的二进制数据流
3.2进制字节流所代表的静态存储结构转化成方法区的运行时数据结构
3.3创建代表此字节码的Class对象
4.连接过程
连接过程又可以分成在个子阶段:
A:验证 :验证 类的字节码是否符合jvm的要求,大致完成以下四个校验动作:
文件格式验证
源数据验证
字节码验证
符号引用验证
B:准备:为类的静态变量分配内存,并将其初始化为默认值
C:解析:把类中的符号引用转换成直接引用
5.初始化过程
类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的static变量将会在这个阶段赋值,成员变量也将被初始化)
6.使用过程
使用类中定义的行为
7.卸载过程
从内存中释放
package com.test;
class Test1{
public static int a;
public static String str;
static{
System.out.println("static execute....a="+a+",str="+str);
str=getString();
}
public Test1(){
System.out.println("New Test1 Instance.");
}
public static String getString(){
System.out.println("static method exectued...");
return "aaa";
}
}
public class ClassLoaderTest1 {
public static void main(String[] args) throws Exception{
Class cls=Class.forName("com.test.Test1");
System.out.println("在使用之前准备就绪");
Test1 t1=(Test1)cls.newInstance();
}
}
输出:
static execute....a=0,str=null
static method exectued...
在使用之前准备就绪
New Test1 Instance.