类加载
Java面试总结----- Java类加载
类加载是Java中非常重要的一块内容。
该博客下所有样例代码会在github
逐步更新,请耐心等待,您可以收藏本文章以获得更新通知
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。
在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的。
1. 简述
1.1 加载:把 .class文件从磁盘加载进内存里。
1.2 连接:确定类与类的关系,其过程分为验证、准备、解析。
1.3 初始化:对静态变量进行赋值,执行 () 方法。
2.生命周期
2.1 加载:查找并加载类的二进制数据
- 通过全限定类名来获取定义此类的二进制字节流。1
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,即把二进制数据流放在方法区内。
- 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。
2.2 连接:
2.3 初始化:
为类的静态变量赋予正确的初始值。
到初始化阶段,才真正开始执行类中定义的 Java 程序代码,此阶段是执行 <clinit>()
方法的过程。
<clinit>()
方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。(不包括构造器中的语句。构造器是初始化对象的,类加载完成后,创建对象时候将调用的 <init>()
方法来初始化对象)
2.4 使用: 程序正常使用这个类。
2.5 卸载: 从内存中删除(不常用)
3.补充知识
3.1 Java程序对类的使用方式分为:
-
主动使用
- 创建类的实例
- 访问某个类或某个接口的静态变量(助记符为
getstatic
),或者对它们的静态变量进行赋值(助记符为putstatic
) - 调用类的静态方法(助记符为
invokestatic
) - -反射(如Class.forName(“com.test.Test”)
- 初始化一个类的子类
- Java虚拟机启动时被标明启动类的类,虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类。
- 动态语言…
- 被动使用(除了主动初始化其他)
所有的Java虚拟机必须在每个类或者接口被Java程序“首次主动使用时
”才初始化它们,如果不是首次使用或非主动使用是不会被初始化的
3.2 当出现以下几种情况时,虚拟机退出执行:
- 执行了
System.exit()
方法。 - 程序正常结束。
- 程序在运行期间遇到了错误或异常而异常终止。
- 操作系统出现错误导致程序终止。
3.3 从哪儿加载.class文件
-
本地磁盘
-
网上加载.class文件(Applet)
-
从数据库中
-
压缩文件中(ZAR,jar等)
-
从其他文件生成的(JSP应用)
-
将Java源文件动态编译成.class 文件(动态代理)