JAVA虚拟机之类加载器
一.类的加载概述
类加载的过程:
1. 当程序要加载某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三部来实现对这个类进行初始化.
加载:当虚拟机需要使用类A.java时,会拿他的字节码文件(.class),并用解析该文件到内存,创建一个对象
官方话:(类加载器负责将.class文件加载到内存中,并生成对象(字节码文件对象))
连接:
验证:目的在于确保当前加载的class文件符合虚拟机要求,能被虚拟机使用,并且不会影响虚拟机安全,
主要包括四种验证方式:
- 文件格式验证
- 元数据验证
- 字节码验证
- 符号引用验证
准备:为类对象中的静态变量赋值,分配内存,并且设置该类变量的初始值即0(比如static int a = 6
这里只将a初始化为0)
这里不会为实例变量分配初始化值,类变量会分配在方法区中,而实例变量会随着对象一起分配到java堆咋中
解析:将字节码文件变为Java虚拟机可用的对象
初始化:类加载的最后一步,前面一些没有赋值(普通成员变量),或者值赋值为初始值的变量(如static修饰的),会在这个时候完成赋值;
2. 常见的三种加载器:
- Bootstrap 最顶级的加载器,加载的是最基本的东西,最底层的东西
- ExtClassLoder 扩展类加载器,加载都都是jdk自己使用的类
- AppClassLoder 加载程序员写的class文件
当使用某个类是,jvm会把加载该类的.class文件,
3. 如何获取一个加载器?
首先要的到一个类的字节码文件(Class文件)对象,使用该对象中的getClassLoader()方法来获取类加载器对象
ClassLoader getClassLoader(); 返回类的加载器
4. 类加载器的作用
ClassLoader cla = Class.getClassLoader();
这里的Class是一个对象,是你获取到的Class对象,比如:Class clazz = Class.forname("com.db.student");
然后这里的获取这个对象的类加载器,这个类的作用就是根据一个指定的类的全限定名,找到对应的Class字节码文件,然后加载它转化成一个java.lang.Class类的一个 实例.
5. 它解释比较抽象,在jdk类源文件中是比不可少的,jdk中存在的大多都是class类型的文件,这就要通过加载器来创建这些class文件可以被jvm使用的对象了;
他的主要作用就是讲二进制文件转换为JVM可用的数据,比如对象!