类的加载机制

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/obession/article/details/77040141

1.概述:虚拟机把class文件加载到内存,并对数据校验,解析,初始化,最终形成虚拟机可以直接使用的java类型;这就是虚拟机的类加载机制;其分为三部分,加载,连接,初始化并且都是在程序运行期间完成的,Java动态语言的扩展性就是依赖运行期动态加载和动态连接实现的。整个类的声明 周期为:加载--》连接(包括验证,准备,解析)--》初始化--》使用--》卸载


2.类的加载:类的加载由类加载器完成

a.类的来源:1.从本地加载class文件;2.通过网络加载class文件;3.从JAR包加载class文件;4.java源文件动态编译,并执行加载;

b.类加载器:1.JVM中,类用其全限定名和类加载器作为唯一标识;
2.三个类加载器结构:Bootstrap ClassLoader:根类加载器,负责加载核心java类,如Sting,System核心内裤;Extension ClassLoader:扩展类加载器,负责加载JER的扩展目录;System ClassLoader,系统类加载器,;
3.三种类加载机制:全盘负责;分类委托;缓存机制
类加载class大概过程如图:




3.类的连接:包括验证,准备,解析;


4.类的初始化:虚拟机负责对类进行初始化,主要是对类变量(static)进行初始化;对类变量指定初始值可以在①声明的时候指定②可以在静态初始化块中指定;这两种语句都被当做类的初始化语句,在初始化的时候按顺序执行他们;
a.初始化的三个步骤:①这个类还没有被加载和连接,先加载和连接;②该类的父类还没有被初始化,先初始化其父类,所以JVM最先初始化的是Object类;③如果类有初始化语句,就按顺序执行;
b.Java虚拟机指定了有且只有5种情况会对类进行初始化,这5种情况的场景是:
   ①使用new关键字实例化对象,读取或者设置类的静态字段(被final修饰,放入常量池的静态字段除外)调用静态方法的时候;
②反射方式创建java.lang.class对象时
③初始化某个类的子类,其父类自动初始化
④虚拟机启动,用户指定一个主类,main函数那个类,会被初始化;
⑤JDK1.7时,java.lang.invoke.MethodHandle实例最后的解析结果对应的类没有进行过初始化,则需要初始化;


初始化子类会先初始化父类。顺序为 父类静态——》子类静态——》父类非静态代码块——》父类构造方法——》子类非静态代码块——》子类构造方法。
展开阅读全文

没有更多推荐了,返回首页