Java@深入理解Java虚拟机:类加载机制


Java@深入理解Java虚拟机:类加载机制
文章图片
Java@深入理解Java虚拟机:类加载机制
文章图片
虚拟机把描述类的数据从Class文件加载到内存 , 并对数据进行校验 , 解析和初始化 , 最终形成可以被虚拟机直接使用的Java类型 。
一、类的生命周期
二、类加载时机必须对类进行\"初始化\"的情况:

  1. 使用new关键字实例化对象的时候
  2. 读取或设置一个类型的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候 。
  3. 调用一个类型的静态方法的时候
  4. 使用java.lang.reflect包的方法对类型进行反射调用的时候 。
  5. 当初始化类的时候 , 发现其父类还没有进行过初始化的时候 。
  6. 当虚拟机启动时 , 用户需要制定一个要执行的主类(包含main()方法的那个类) , 虚拟机会先初始化这个主类 。
  7. 如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic、REF_newInvokeSpecial四种类型的方法句柄 , 并且这个方法句柄对应的类没有进行过初始化的时候
  8. 被default关键字修饰的接口方法 , 如果这个接口的实现类发生了初始化的时候 。
三、类加载的过程1、加载加载(Loading)阶段是整个类加载过程中的一个阶段 。
加载阶段需要完成的事
  1. 通过一个类的全限定名来获取定义此类的二进制字节流 。
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 。
  3. 在内存中生成一个代表这个类的java.lang.Class对象 , 作为方法区这个类的各种数据的访问入口 。
【Java@深入理解Java虚拟机:类加载机制】获取二进制字节流的来源:
  1. 从ZIP压缩包中读取 , JAR、EAR、WAR 。
  2. 从网络中获取 , Web Applet 。
  3. 动态代理
  4. 由其他文件生成 , JSP文件生成对应的Class文件 。
  5. 从数据库中读取 , SAP Netweaver可以选择把程序安装到数据库中完成程序代码在集群间的分发 。
  6. 可以从加密文件中获取 , 防Class文件被反编译的保护措施 , 通过加载时解密Class文件来保障程序运行逻辑不被窥探 。
2、验证确保Class文件的字节流中包含的信息符合约束要求 , 保证这些信息被当作代码运行后不会危害虚拟机自身的安全 。
四个阶段的验证动作:
  1. 文件格式验证 , 包括魔数、主次版本、常量池常量类型 , 访问标识等等
  2. 元数据验证 , 包括是否有父类、是否继承了不允许被继承的类 , 非抽象类是否实现了父类或接口中要求实现的方法等等
  3. 字节码验证 , 通过数据流分析和控制流分析 , 确定程序语义是合法的、符合逻辑的 。
  4. 符号引用验证 , 对类自身以外的各类信息进行匹配性校验(该类是否缺少或者禁止访问它依赖的某些外部类、方法、字段等资源)