(java)类的加载过程一

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.


猜你喜欢

转载自blog.csdn.net/seanme/article/details/79466324