首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Java的类加载阶段,符号引用是如何解析为直接引用的?

在Java的类加载阶段,符号引用是通过解析过程转化为直接引用的。符号引用是一种编译时的引用,它以符号的形式描述所引用的目标,而不直接指向目标。而直接引用则是可以直接指向目标的指针、偏移量或者是一个能够定位到目标的句柄。解析过程主要包括以下几个步骤:

  1. 虚拟机将符号引用中的类名、字段名、方法名等符号信息定位到运行时常量池中对应的符号引用。
  2. 虚拟机通过符号引用中的类名找到对应的类,并检查类是否已经被加载、解析和初始化过,如果没有则先进行相应的类加载过程。
  3. 虚拟机对类中的字段和方法进行符号引用的解析,将其解析为对应的直接引用。
  4. 如果解析的目标是一个字段,虚拟机将解析结果直接指向目标字段在方法区中的内存地址。
  5. 如果解析的目标是一个普通方法,虚拟机将解析结果直接指向目标方法在方法区中的内存地址。
  6. 如果解析的目标是一个接口方法,虚拟机将解析结果直接指向目标方法在方法区中的内存地址,同时进行接口方法的调用权限校验。

总之,通过解析过程,虚拟机可以将符号引用转化为直接引用,从而实现对类、字段和方法的访问和调用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java Tomcat 中是如何加载

之前实习时候学习JavaMelody源码,但是它是一个Maven项目,与我们自己Web项目整合后无法直接断点调试。 后来同事指导,说是直接Java复制到src下就可以了。...当用户自己代码中,需要某些额外时,再通过加载机制加载到JVM中,并且存放一段时间,便于频繁使用。 因此使用哪种类加载器、什么位置加载都是JVM中重要知识。...WEB-INF/lib中加载 5、使用common加载CATALINA_HOME/lib中加载 四、问题扩展 通过对上面Tomcat加载机制理解,就不难明白 为什么Java文件放在Eclipse...而Eclipse外部引用jar包,则相当于放在 WEB-INF/lib 中。 因此肯定是 Java文件或者JSP文件编译出class优先加载。...通过这样,我们就可以简单Java文件放置src文件夹中,通过对该Java文件修改以及调试,便于学习拥有源码Java文件、却没有打包成xxx-sourcejar包。

2.5K20

Java加载机制七个阶段加载、验证、准备、解析、初始化、使用、卸载

Java加载机制七个阶段 当我们Java代码编译完成后,会生成对应 class 文件。...而 JVM 虚拟机执行 class 字节码过程可以分为七个阶段加载、验证、准备、解析、初始化、使用、卸载。 ? 加载 下面是对于加载过程最为官方描述。 加载阶段加载过程第一个阶段。...准备阶段,JVM 会为变量分配内存,并为其初始化。但是这里初始化指的是变量赋予 Java 语言中该数据类型零值,而不是用户代码里初始化值。...解析 当通过准备阶段之后,JVM 针对或接口、字段、方法、接口方法、方法类型、方法句柄和调用点限定符 7 引用进行解析。...这个阶段主要任务是将其常量池中符号引用替换成直接其在内存中直接引用。 其实这个阶段对于我们来说也是几乎透明,了解一下就好。

7K40
  • 【进阶之路】深入理解Java虚拟机加载机制(长文)

    可以理解在编译期即把结果放入了常量池中,同时ConstantValue属性值只限于基本类型和String类型。 四、解析阶段 解析阶段Java虚拟机将常量池内符号引用替换为直接引用过程。...直接引用直接引用是可以直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄。直接引用是和虚拟机实现内存布局直接相关,同一个符号引用在不同虚拟机实例上翻译出来直接引用一般不会相同。...1、对或者接口解析步骤 1、判断将要解析符号引用是不是一个数组类型,如果不是,那么虚拟机将会把该符号代表全限定名称传递给加载器去加载这个。...3、如果上面的步骤正常执行,那么该符号引用已经虚拟机中产生了一个直接引用,但是解析完成之前需要对符号引用进行验证,主要是确认当前调用这个符号引用是否具有访问权限,如果没有访问权限将抛出java.lang.IllegalAccess...3、对方法解析步骤 1、方法和接口方法符号引用是分开,所以如果在方法表中发现class_index(中方法符号引用索引是一个接口,那么会抛出java.lang.IncompatibleClassChangeError

    36710

    面试官:请你谈谈 Java 加载过程

    今天,小编就 Java 加载过程这个问题,抛砖玉,说一下自己理解,如果有不对地方,欢迎大家评论去指正。...校验符号引用访问性(private,public等)是否可被当前访问? 准备 主要是变量(注意,不是实例变量)分配内存,并且赋予初值。...解析 将常量池内符号引用替换为直接引用过程。两个重点: 符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个相关信息。 直接引用。...可以理解一个内存地址,或者一个偏移量。比如方法,变量直接引用是指向方法区指针;而实例方法,实例变量直接引用则是从实例头指针开始算起到这个实例变量位置偏移量。...解析阶段,虚拟机会把所有的名,方法名,字段名这些符号引用替换为具体内存地址或偏移量,也就是直接引用。 初始化 这个阶段主要是对变量初始化,是执行构造器过程。

    2.2K20

    深入理解JVM中加载机制

    **先来个官方叙述:**加载Java虚拟机把描述数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化、最终形成可以被虚拟机直接使用Java类型。...符号引用验证 符号引用验证可以看做是对自身(常量池中各种符号引用)信息进行匹配性校验,它目的是确保解析动作能够正常执行,如果无法通过符号引用验证,则会抛出异常。...符号引用验证阶段通常需要校验以下内容: 符号引用中通过字符串描述全限定名是否能找到对应制定中是否存在符合方法字段描述符以及简单名称所描述方法和字段。...下表列出了所有Java基础类型零值: 2.4 解析 解析阶段就是将Class中常量池中符号引用解析直接引用。...符号是使用一组符号描述被引用目标,引用目标不一定加载到内存中;直接引用可以使直接指向目标地址指针,相对偏移量或者间接定位到目标的句柄,有了直接引用引用目标一定存在在虚拟机中。

    46930

    面试官:请你谈谈Java加载过程

    今天,小编就Java加载过程这个问题,抛砖玉,说一下自己理解,如果有不对地方,欢迎大家评论去指正。...比如8种基本类型初值,默认为0;引用类型初值则为null;常量初值即为代码中设置值,final static tmp = 456, 那么该阶段tmp初值就是456 解析 将常量池内符号引用替换为直接引用过程...两个重点: 符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个相关信息。 直接引用。可以理解一个内存地址,或者一个偏移量。...比如方法,变量直接引用是指向方法区指针;而实例方法,实例变量直接引用则是从实例头指针开始算起到这个实例变量位置偏移量 举个例子来说,现在调用方法hello(),这个方法地址是1234567...解析阶段,虚拟机会把所有的名,方法名,字段名这些符号引用替换为具体内存地址或偏移量,也就是直接引用。 初始化 这个阶段主要是对变量初始化,是执行构造器过程。

    18710

    JVM加载Class文件原理机制探析

    2.3 解析 解析阶段是指将常量池中符号引用转换为直接引用过程。Java中,符号引用是一种对编译时声明方法、字段、接口等引用,而直接引用是直接指向内存中实际数据结构引用。...JVM解析阶段会将或接口符号引用替换为对应直接引用,以便后续执行阶段能够快速访问到所需数据。...这个过程主要包括以下几个方面的处理: 或接口符号引用解析:将或接口符号引用转换为对应直接引用。例如,将全限定名转换为内存中实际地址。...字段符号引用解析:将字段符号引用转换为对应直接引用。例如,将字段名和字段类型转换为内存中具体位置。 方法符号引用解析:将方法符号引用转换为对应直接引用。...例如,将方法名和参数类型转换为内存中具体指令。 解析阶段通常在连接阶段最后进行,因为它需要确保所有的和接口都已加载、验证和准备完毕,才能进行符号引用解析。 3.

    20940

    加载器知识点吐血整理

    加载阶段,jvm 需要完成如下工作: 1.通过全限定名获取二进制数据流 2.解析二进制数据流方法区内数据结构 3.创建 java.lang.Class 实例,表示该类型 获取二进制数据流方式有很多...) ACC_PUBLIC, ACC_STATIC, ACC_FINAL ConstantValue: String constant 解析 解析阶段主要把、接口、字段和方法符号引用转为直接引用...符号引用符号引用是以一组符号来描述所引用目标,符号可以是任何形式字面量,只要使用时可以无歧义地定位到目标即可 直接引用直接引用是可以直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄...符号引用 其实上面的引用关系就是符号引用 但在程序运行时,光有符号引用是不够,系统需要明确知道该方法位置,所以 jvm 每个准备了一张方法表,将其所有的方法都列入到了方法表中,当需要调用一个方法时...通过解析操作,符号引用可以转变为目标方法方法表中位置,使得方法被成功调用。 初始化 初始化是加载最后一个阶段,只要前面的阶段都没有问题,就会进入到初始化阶段。那初始化阶段做什么工作呢?

    37520

    Java虚拟机:加载机制与双亲委派模型

    加载机制,就是虚拟机把数据从class文件加载到内存,并对数据进行校检,转换解析和初始化,最终形成可以被虚拟机直接使用Java类型过程。...(4)符号引用验证:对自身以外信息(常量池中各种符号引用信息进行校检,确保解析动作能正常执行(该动作发生在解析阶段中) 3、准备阶段: 正式变量分配内存空间并设置数据类型零值。...4、解析阶段: 将常量池符号引用替换为直接引用过程。解析动作主要针对或接口、字段、方法、接口方法、方法类型、方法句柄、和调用限定符7符号引用。...(1)符号引用符号引用是以一组符号来描述所引用目标,符号可以是任何字面量,只要使用时无歧义定位到目标即可。符号引用与虚拟机内存布局无关,引用目标并不一定已经加载到内存中。...(2)直接引用直接引用是可以直接定位到目标的指针、相对偏移量或是一个能间接定位目标的句柄。直接引用是与虚拟机内存布局相关,同一个符号引用在不同虚拟机实例上翻译出来直接引用一般不会相同。

    43230

    加载机制

    加载阶段Java虚拟机需要完成以下三件事情: 通过一个全限定名来获取定义此类二进制字节流。(《Java虚拟机规范》没有指明要从哪里获取、如何获取。)...符号引用验证 最后一个阶段校验行为发生在虚拟机将符号引用转化为直接引用时候,这个转化动作将在连接第三阶段——解析阶段中发生。...直接引用是和虚拟机实现内存布局直接相关,同一个符号引用在不同虚拟机实例上翻译出来直接引用一般不会相同。如果有了直接引用,那引用目标必定已经虚拟机内存中存在。...连接之解析 解析阶段Java虚拟机将常量池内符号引用替换为直接引用过程。...下面讲解前4种引用解析过程 或接口解析 假设当前代码所处D,如果要把一个从未解析符号引用N解析一个或接口C直接引用,那虚拟机完成整个解析过程需要包括以下3个步骤: 如果C不是一个数组类型

    63920

    虚拟机加载机制

    解析阶段Java虚拟机将常量池内符号引用替换为直接引用过程 解析阶段往往伴随着JVM执行完初始化之后再执行 解析动作主要针对或接口、字段、方法、接口方法、方法类型等。...符号引用与虚拟机实现内存布局无关,目标并不一定是已经加载到虚拟机内存当中内容。...各种虚拟机实现内存布局可以各不相同, 但是它们能接受符号引用必须都是一致,因为符号引用字面量形式明确定义Java虚拟机规 范》Class文件格式中。...直接引用 直接引用(Direct References):直接引用是可以直接指向目标的指针、相对偏移量或者是一个能 间接定位到目标的句柄。...直接引用是和虚拟机实现内存布局直接相关,同一个符号引用在不同虚 拟机实例上翻译出来直接引用一般不会相同。如果有了直接引用,那引用目标必定已经虚拟机 内存中存在。

    8710

    Java栈帧和动态链接是什么?

    动态链接实际上就是符号引用转变为直接引用符号引用转为直接引用是加载过程中一个关键步骤,它发生在解析阶段。...直接引用是与虚拟机实现内存布局紧密相关,同一个符号引用在不同虚拟机实例上甚至同一虚拟机实例不同类加载过程中可能都会转换为不同直接引用。...加载解析阶段,虚拟机将常量池内符号引用替换为直接引用过程称为解析解析加载过程中必不可少一个环节。...对于这7符号引用,未必一定能在解析阶段或第一次使用时就完成解析,有些符号引用是真正使用时候才进行解析,这种解析方式称为惰性解析。...总的来说,符号引用转为直接引用是Java加载过程中解析阶段一个重要步骤,它确保了符号引用能够被正确地解析内存中直接引用,从而实现Java程序正常运行。 所以,你了解栈帧和动态链接了么?

    46910

    如何加载

    Java 中,加载流程有一个专门机制叫做“加载机制”。加载机制是指一个 Java 虚拟机(JVM)中执行流程,它也是 Java 程序能够正常执行关键所在,那它具体执行流程是啥?...流程概述 JVM 中,加载会经历以下 5 个阶段加载阶段(Loading) 验证阶段(Verification) 准备阶段(Preparation) 解析阶段(Resolution) 初始化阶段...2.3 解析阶段 解析阶段就是将常量池中符号引用更换成直接引用了,所谓符号引用是指以一组符号来描述所引用目标,符号可以是任何形式字面量,只要使用时能无歧义地定位到目标即可;而直接引用是可以直接指向目标的指针...符号引用直接引用有一个重要区别:使用符号引用时被引用目标不一定已经加载到内存中;而使用直接引用时,引用目标必定已经存在虚拟机内存中了。...准备阶段(Preparation):给静态变量设置默认值。 解析阶段(Resolution):将符号引用转换为直接引用

    51530

    持续3分钟 - Java -09

    注意这里所说初始值概念,比如一个变量定义: public static int address = 8080; 实际上变量 address 准备阶段过后初始值 0 而不是 8080,将 address...1.4 解析 解析阶段是指虚拟机将常量池中符号引用替换为直接引用过程。符号引用就是 class 文件中: 1. CONSTANT_Class_info 2....CONSTANT_Method_info 等类型常量。 1.5 符号引用 符号引用与虚拟机实现布局无关,引用目标并不一定要已经加载到内存中。...各种虚拟 机实现内存布局可以各不相同,但是它们能接受符号引用必须是一致,因为符号字面量形式明确定义 Java 虚拟机规范 Class 文件格式中。...1.7 初始化 初始化阶段加载最后一个阶段,前面的加载阶段之后,除了加载阶段可以自定义加载器以外,其它操作都由 JVM 主导。到了初始阶段,才开始真正执行中定义 Java 程序代码。

    40020

    Java你了解多少(每日一练)

    在这五个阶段中,加载、验证、准备和初始化这四个阶段发生顺序是确定,⽽解析阶段则不一定,它在某些情况下可以初始化阶段之后开始。⽐如:动态绑定或晚期绑定。...字节码验证:通过数据流和控制流分析,确定程序语义是合法、符合逻辑符号⽤验证:确保解析动作能正确执行。...解析符号⽤转换为直接引⽤。 解析阶段是虚拟机将常量池内符号⽤替换为直接引⽤过程,解析动作主要针对或接⼝、字段、⽅法、接⼝方法、⽅法类型、⽅法句柄和调用点限定符7符号⽤用进行。...符号⽤就是⼀组符号来描述⽬标, 可以是任何字⾯量。 直接引用就是直接指向目标的指针、相对偏移量或⼀个间接定位到目标的句柄。...Java 中对变量进行初始值设定有两种方式: 声明变量时指定初始值 使⽤静态代码块变量指定初始值 jvm初始化步骤: 假如这个还没有被加载和连接,则程序先加载并连接该类 假如该类直接还没有被初始化

    17810

    Java虚拟机

    通过数组定义来引用,不会触发此类初始化 常量在编译阶段会存入调用常量池中,本质上没有直接引用到定义常量,因此不会触发定义常量初始化 三、加载过程 加载、验证、准备、解析和初始化 5...符号引用验证 最后一个阶段校验行为发生在 虚拟机将符号引用转化为直接引用时候 这个转化动作将在连接第三阶段—— 解析阶段中发生 是对自身以外(常量池中各种符号引用各类信息进行匹配性校验...解析 解析阶段 :是Java虚拟机将常量池内 符号引用 替换为 直接引用 过程 符号引用(Symbolic References) :符号引用 以一组符号来描述所引用目标 ,符号可以是任何形式字面量...直接引用(Direct References) :直接引用是 可以直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄 。...直接引用是 和虚拟机实现内存布局直接相关 ,同一个符号引用在不同虚拟机实例上翻译出来直接引用一般不会相同。如果有了直接引用,那 引用目标必定已经虚拟机内存中存在 。

    70800

    虚拟机加载机制

    比如: CONSANT_Class_info 所对应是否已经被加载进内内存了 相关字段,方法符号引用是否能得到对应 对,方法,字段访问性是否能得到满足 等等等等 符号引用验证通过之后,解析阶段才能继续...解析 整个解析过程其实只干了一件事情,就是将==符号引用转换成直接引用==。原先,我们 Class 文件中常量池里面,存在两种类型常量,直接字面量(直接引用)和符号引用。...直接引用直接入驻常量池,而符号引用则需要通过解析阶段来实际指向运行时常量池中直接引用地址。 这就是解析阶段所要完成事情,下面我们具体看看不同符号引用是如何被翻译成直接引用。...1、或接口解析 假设当前代码所处是 A, A 中遇到一个新类型 B,也可以理解 A 中存在一个 B 类型符号引用。...那么对于 B 类型解析过程如下: 通过常量池找到 B 这个符号引用所对应直接引用全限定名 utf8 编码) 把这个全限定名称传递给虚拟机完成加载(包括我们完整七个步骤) 替换 B 符号引用内存中刚加载或者接口地址

    97770

    Java虚拟机

    通过数组定义来引用,不会触发此类初始化 常量在编译阶段会存入调用常量池中,本质上没有直接引用到定义常量,因此不会触发定义常量初始化 三、加载过程 加载、验证、准备、解析和初始化 5...符号引用验证 最后一个阶段校验行为发生在 虚拟机将符号引用转化为直接引用时候 这个转化动作将在连接第三阶段—— 解析阶段中发生 是对自身以外(常量池中各种符号引用各类信息进行匹配性校验...解析 解析阶段 :是Java虚拟机将常量池内 符号引用 替换为 直接引用 过程 符号引用(Symbolic References) :符号引用 以一组符号来描述所引用目标 ,符号可以是任何形式字面量...直接引用(Direct References) :直接引用是 可以直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄 。...直接引用是 和虚拟机实现内存布局直接相关 ,同一个符号引用在不同虚拟机实例上翻译出来直接引用一般不会相同。如果有了直接引用,那 引用目标必定已经虚拟机内存中存在 。

    63220

    Java虚拟机:加载机制详解

    符号引用验证发生在虚拟机将符号引用转化为直接引用时候,这个转化动作是连接第三阶段——解析阶段中进行符号引用验证目的是确保解析动作能够正常执行。...如果是引用类型初始默认值就是null。 解析 解析阶段是虚拟机将常量池内符号引用替换为直接引用过程。...符号引用符号引用以一组符号来描述所引用目标,符号可以使任何形式字面量,只要使用时能无歧义定位到目标即可。符号引用字面量形式Java虚拟机规范Class文件格式中有明确定义。...直接引用直接引用可以是直接指向目标的指针、相对偏移量或者是一个能间接定位到目标的句柄。直接引用是和虚拟机实现内存布局有关,同一个符号引用在不同虚拟机实例上翻译出来直接引用一般不会相同。...如果有了直接引用,那么引用目标必定已经在内存中存在。 解析动作主要针对或接口、字段、静态方法、接口方法、方法类型、方法句柄和调用点限定符这几类符号引用进行。

    28510

    java加载过程 父_加载机制原理

    加载后就进入连接阶段,这一阶段包括验证、准备(静态变量分配内存并设置默认初始值)和解析(将符号引用替换为直接引用)三个步骤。...而准备步骤则负责该类型分配它所需内存、比如变量分配内存。解析步骤则负责把常量池中符号引用转换为直接引用。...连接分为如下三个阶段: 验证:验证阶段用于检验被加载是否有正确内部结构,并和其他协调一致; 准备:准备阶段则负责静态属性分配内存,并设置默认初始值; 解析:将二进制数据中符号引用替换成直接引用...(符号引用是用一组符号描述所引用目标;直接引用是指向目标的指针) 验证 验证是连接阶段第一步, 这一阶段目的是为了确保 Class文件字节流中包含信息符合当前虚拟机要求, 井且不会危害虚拟机自身安全...直接引用是与虚拟机实现内存布局相关 , 同一个符号引用在不同虚拟机实例上翻译出来直接引用一般不会相同.

    71020
    领券