类加载
-
计算机两级存储
1. 内存:
缺点:容量小(4G,8G),断电后内容丢失,价格贵
优点:速度快,
2. 磁盘:
缺点:速度慢
优点:容量大(1T,2T),断电内容不丢失,价格便宜因而我们编写的代码编译后产生的.class 在磁盘同时 CPU 速度快,而磁盘慢,从内存中读取数据,因而我们程序从磁盘加载到内存中
- 类加载
- 加载一次验证
public class ReflectDemo01 {
public static void main(String[] args) throws
ClassNotFoundException {
//
Class clazz1=Book.class;
Class clazz2=Book.class;
System.out.println(clazz1==clazz2);//true说明是一次,如果加载多次,多个像,就不同了
Class clazz3= Class.forName("cn.edu.xcu.reflect.entity.Book");
System.out.println(clazz3==clazz1);//true
}
}
- 加载顺序
- 加载步骤详解
1. 加载:类加载过程的一个阶段:通过一个类的完全限定查找此类字节码文件,并利用字节码文件创建一个 Class 对象
2. 验证:目的在于确保 Class 文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证,文件格式验证,元数据验证,字节码 验证,符号引用验证。
3. 准备:为类变量(即 static 修饰的字段变量)分配内存并且设置该类变量的初始值即 0(如static int i=5;这里只将 i 初始化为 0,至于 5 的值将在初始化时赋值),这 里不包含用 final修饰的 static,因为 final 在编译的时候就会分配了,注意这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一 起分配到 Java 堆中。
4. 解析:主要将常量池中的符号引用替换为直接引用的过程。符号引用就是一组符号来描述目标,可以是任何字面量,而直接引用就是直接指向目标的指针、相对 偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析(这里涉及到字节码变量的引用,如需更详细了解,可参考《深入 java 虚拟机》)。
5. 初始化:类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的 static 变量将会在这个 阶段赋值,成员变量也将被初始化)