类装载器子系统

1.类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。

2.流程图:

3.加载方式:

Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,

并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出

该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。但第二次实

例化一个类时,就从对应Class类newInstance(),不用每次都读取.class文件。 

4、类加载过程

一、JVM将整个类加载过程划分为了三个步骤:

(1)装载(加载)

1).通过一个类的全限定名获取定义此类的二进制字节流

2).将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3).再内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

(2)链接

      链接过程负责对二进制字节码的格式进行:校验、解析类中调用的接口、类。校验是防止不合法的.class文件,然后 对类中的所有属性、调用方法进行解析,以确保其需要调用的属性、方法存在,以及具备应的权限(例如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError等错误信息。

  连接:

    a、验证:确保被加载的类的正确性

    b、准备:为类的静态变量分配内存,并将其初始化为默认值

    c、解析: 把类中的符号引用转化为直接引用

(3)初始化

      初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化。

  在四种情况下初始化过程会被触发执行:

      调用了new;

  反射调用了类中的方法;

  子类调用了初始化(先执行父类静态代码和静态成员,再执行子类静态代码和静态变量,然后调用父类构造器,最后调用自身构造器。);

  JVM启动过程中指定的初始化类。 

posted @ 2020-03-15 17:29  王余阳  阅读(191)  评论(0)    收藏  举报