`
chenjingbo
  • 浏览: 460047 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

类加载机制-解析

 
阅读更多

解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程.这里需要注意三个点,第一是常量池”,也就是是处理常量池信息的,第二个和第三个点一起说就是直接引用符号引用”.其实这两个概念很好理解.


看上图的常量池,”//”注释的就是符号引用常量.它在常量池中的信息是通过一个引用值来标识的.其他可以直接获取到的值,它其实是直接指向目标的指针,便宜了或者句柄.

解析这个步骤做的事情通俗一点说,就是把”//”后面的数据拿到.

解析动作主要针对类或接口,字段,类方法,接口方法四类符号引用进行.至于NameAndType类型的常量,撒迦是这么说的



 
下面分别对应于四种引用解析过程.

ps :下面的解析过程都可以看到它会到父类,父接口中去找对应的直接引用.其实很好理解:我们在某个方法中是可以直接引用父类或者父接口的常量信息的.

类或接口的解析

这个对应于CONSTANT_Class_info.也就是替换类或接口的..整个解析步骤入下

(1)   如果该引用对应的类不是数组,则会加载对应的类.当然在这个过程中有可能触发其他类的加载(比如父类的加载)

(2)  如果该引用对应为一个数组,那么会先按照(1)加载对应数组中的对象,然后由虚拟机生成一个代表此数组维度和元素的数组对象.

(3) 如果(1)(2)都没有异常,最后就进行符号引用验证.确定该常量池所对应的类是否有权限访问这个类.如果没有权限,则抛出java.lang.IllegalAccessError

  字段解析

这个对应为CONSTANT_Fieldref_info .看下之前在常量池的文档里对CONSTANT_Fieldref_info的描述

写道
CONSTANT_Fieldref_info {
u1 tag; ##值为9
u2 class_index; ##指向字段的类或者接口描述符的索引值
u2 name_and_type_index; ## 指向字段描述符的索引值
}

 可以看到CONSTANT_Fieldref_info的第二位描述的是这个字段所属的类或者接口的符号引用,所以说,在进行字段解析的时候,会先解析这个类(或者接口)的符号引用.当解析成功以后,才会开始下面的步骤(假设字段所属的类为C)

(1) 如果C本身就包含了这个字段对应的简单名称和字段描述符都与目标相匹配的字段,则直接返回

(2)如果C实现了接口,则递归到被实现的接口和父接口里面找,找到这个字段对应的简单名称和字段描述符都与目标相匹配的字段,则返回.

(3) 递归到C的父类继续找, ,找到这个字段对应的简单名称和字段描述符都与目标相匹配的字段,则返回.注意,这里会一直递归到Object.

(4) 如果上面3条都找不到的话,则抛出java.lang.NoSuchFieldError.

 

虽然虚拟机规定在解析Field的时候是按照这个顺序,但是编译器会比上面的规范更加严格.比如在同一个类型的同名字段同时出现接口或者起父类中的时候,编译器会拒绝编译.

当然,在最后还是会检查权限问题,如果无权限,则抛出java.lang.IllegalAccessError

 

类方法解析

这个步骤对应的是CONSTANT_Methodref_info.它也和字段解析一下,需要先解析出类方法表中的class_index.这个解析成功以后才会继续如下步骤(假设字段所属的类为C):

(1)这一条需要待定,我还有疑惑.这一步的检查大概是这样的,它会检查对应的C是否C是一个接口,如果是接口,则抛出java.lang.IncompatibleClassChangeError

(2) 如果通过了第一步,那么再到C中找是否有简单名称和描述符都与目标相匹配的方法.如果有则直接返回.

(3)C的父类中递归查找是否有简单名称和描述符都与目标相匹配的方法.如果有则直接返回(一直递归到Object).

(4)在实现C的接口列表及其父接口中递归查找是否有简单名称和描述符都与目标相匹配的方法.如果有则说明是抽象类.这个时候抛出java.lang.AbstractMethodError.这个需要这么理解,如果是普通的类去实现某一个接口的方法的话,那么它肯定在第(2)步已经直接返回.如果能执行到第(4),则说明C本身的常量池中并没有对应的直接引用.那么只能是说明这个方法是抽象方法.包含抽象方法的类必定是抽象类,所以这里有个结论就是C是抽象类.

(5)如果执行到这里,则抛出java.lang.NoSuchMethodError

 当然,在最后还是会检查权限问题,如果无权限,则抛出java.lang.IllegalAccessError

注意,字段解析是先解析父接口,然后再解析父类,而方法解析是先解析父类,再解析父接口.

接口方法解析

         这个对应的是CONSTANT_InterfaceMethodref_info.注意这里的方法是接口中的方法,这个在常量池那里已经说明.所以它对应的类肯定是一个接口. 它也是需要先解析接口方法表中class_index项中的索引的方法所属的类或者接口的符号引用.如果解析成功,才会指向如下步骤(继续用C表示这个接口)

(1) C是否C是一个类(而不是一个接口),则抛出java.lang.IncompatibleClassChangeError

(2)C中查找是否有简单名称和描述符都与目标相匹配的方法,如果有则返回这个方法的直接引用,

(3) 在接口C的父接口中递归查找是否有简单名称和描述符都与目标相匹配的方法,如果有则返回这个方法的直接引用,

(4)否则,方法解析失败,抛出java.lang.NoSuchMethodError.

由于接口中的方法都是public,所以不会有访问权限问题.

 

 

  • 大小: 10.9 KB
  • 大小: 22.8 KB
分享到:
评论

相关推荐

    性能调优专题-jvm类加载机制-performance-jvmclassloader.zip

    在Java开发中,JVM(Java虚拟机)的类加载机制是至关重要的,因为它负责将类的字节码转换为运行时的实例。本专题"性能调优专题-jvm类加载机制-performance-jvmclassloader"深入探讨了如何通过理解并优化类加载过程来...

    深入研究Java类加载机制 深入研究Java类加载机制

    ### 深入研究Java类加载机制 #### 一、Java类加载机制概述 Java类加载机制是Java程序运行的第一步,它对于理解Java虚拟机(JVM)的行为至关重要。类加载过程涉及到类的加载、链接(验证、准备、解析)、初始化等...

    java类加载机制

    类加载机制不仅涉及到类的加载、验证、准备、解析和初始化等步骤,还包括类加载时机的选择及类加载器的具体工作原理等内容。 #### 一、类加载时机 Java类的生命周期主要包括以下几个阶段:加载、验证、准备、解析...

    tomcat 类加载机制 —— ClassLoader

    《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到...

    Android-Android热修复框架基于类加载机制的代码修复

    本篇文章将深入探讨Android热修复框架的工作原理,特别是基于类加载机制的代码修复。 Android热修复的核心在于替换或修补运行时应用中的问题代码,而实现这一目标的关键是类加载器(ClassLoader)。在Java和Android...

    Java类加载原理解析

    Java 类加载机制是Java技术体系中的重要组成部分,它关乎到程序运行时的类查找与实例化。当遇到`java.lang.ClassNotFoundException`异常时,通常是因为类加载过程出现了问题。了解类加载机制对于解决这类问题至关...

    JVM类加载机制详细讲解

    总结,JVM 类加载机制是Java平台的核心特性之一,它确保了程序的稳定运行和动态扩展能力。理解类加载器的工作原理和双亲委派模型对于优化程序性能、解决类冲突以及构建复杂的模块化系统至关重要。在实际开发中,掌握...

    类加载机制及反射

    类加载机制包括加载、验证、准备、解析和初始化五个阶段,确保了程序的安全性和稳定性。 1. **加载**:这是类加载的第一步,JVM会通过类加载器找到对应的`.class`文件。类加载器主要有Bootstrap ClassLoader(引导...

    JVM实战-JVM类加载机制案例分析

    ### JVM实战-JVM类加载机制案例分析 #### 实验背景与目标 本次实验的主要目的是深入理解Java虚拟机(JVM)中的类加载机制。通过实践操作,掌握类的加载、连接与初始化过程,了解不同类型的类加载器及其工作原理,...

    类加载机制PPT+代码

    类加载机制是Java虚拟机(JVM)运行时的核心机制之一,它负责将类的.class文件从磁盘或网络中加载到内存,并转化为可以执行的Java对象。这一过程包括加载、验证、准备、解析和初始化五个阶段,下面我们来详细探讨...

    ClassLoader类加载机制和原理详解

    本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载机制遵循“双亲委派模型”(Delegation Model)。当一个类被加载时,它首先会尝试由当前...

    Java动态类加载机制研究及应用.pdf

    Java 动态类加载机制研究及应用 Java 动态类加载机制研究及应用是基于 Java 虚拟机(JV M)机制的,旨在实现 Java 应用程序中动态加载类文件,而不影响其他功能模块的正常运行。为了实现这个目标,需要对 Java 类...

    java类加载机制原理与实现

    Java 类加载机制原理与实现 Java 类加载机制是 Java 虚拟机(JVM)的一部分,负责将编译后的 Java 字节码文件加载到 JVM 中,以便执行 Java 程序。类加载机制是 JVM 的核心组件之一,对 Java 程序的执行和安全性起...

    java注解_反射_字节码_类加载机制.zip

    Java注解、反射、字节码和类加载机制是Java编程中的核心概念,它们在实际开发中扮演着重要角色。让我们深入探讨这些知识点。 **Java注解(Annotation)**: Java注解是一种元数据,它提供了在编译时或运行时处理代码的...

    Java类加载机制

    ### Java类加载机制详解 #### 一、引言 Java 的类加载机制是 Java 运行时环境(JRE)中的一个重要组成部分。它负责将 Java 类的字节码(.class 文件)加载到 Java 虚拟机(JVM)中,并确保类的正确加载、链接和...

    JAVA-JVM-01类加载机制

    《JAVA-JVM-01类加载机制》 Java虚拟机(JVM)是Java程序运行的基础,其中类加载机制是其核心组成部分。本文将深入剖析Java中的类加载器和双亲委派机制,并通过示例讲解如何自定义类加载器。 类加载过程是Java程序...

    jvm学习笔记(jvm内存模型&垃圾收集算法&类加载机制)

    在JVM的学习中,理解其内存模型、垃圾收集算法以及类加载机制至关重要。 1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这...

    反射机制和类加载机制学习总结

    类加载机制是指Java虚拟机如何将Java类从文件系统加载到内存中,并准备好让Java程序使用的整个过程。这个过程包括了类的加载、连接和初始化三个阶段。 1. **加载**:找到并加载类的二进制数据。 2. **验证**:确保...

    类加载机制1

    Java 类加载机制是Java语言的核心特性之一,它允许程序在运行时动态地加载和执行类。这个机制在Java 1.0版本时引入,最初是为了支持Java Applet,即可以在Web浏览器中运行的小型Java应用程序。随着时间的发展,类...

    Java类加载机制.doc

    Java 类加载机制是Java平台的核心特性之一,它负责将类的字节码加载到Java虚拟机(JVM)中并转换为运行时的类对象。理解这一机制对于优化应用程序性能和解决类相关的错误至关重要。 首先,类加载的过程分为三个主要...

Global site tag (gtag.js) - Google Analytics