【jvm】虚拟机栈之动态链接

目录

        • 一、说明
        • 二、代码示例
        • 三、生成的字节码
        • 四、字节码说明
          • 4.1 常量池
          • 4.1 方法调用
          • 4.3 变量
          • 4.4 字符串
          • 4.5 父类Object
          • 4.6 System类

一、说明
  • 1.指向运行时常量池的方法引用
  • 2.每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用
  • 3.包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)
  • 4.在java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的
  • 5.动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用
二、代码示例
package com.learning.stack.dynamic_linking;/*** @Author wangyouhui* @Description 动态链接**/
public class DynamicLinkingTest {int num = 10;public void methodOne(){System.out.println("方法1执行了");methodTwo();num++;}public void methodTwo(){System.out.println("方法2执行了");}
}
三、生成的字节码
Classfile /F:/jdk-learning/jvm/target/classes/com/learning/stack/dynamic_linking/DynamicLinkingTest.classLast modified 2023-10-28; size 756 bytesMD5 checksum 96b3029ecd8f2d56b0fc46825936f83bCompiled from "DynamicLinkingTest.java"
public class com.learning.stack.dynamic_linking.DynamicLinkingTestminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #9.#23         // java/lang/Object."<init>":()V#2 = Fieldref           #8.#24         // com/learning/stack/dynamic_linking/DynamicLinkingTest.num:I#3 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;#4 = String             #27            // 方法1执行了#5 = Methodref          #28.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V#6 = Methodref          #8.#30         // com/learning/stack/dynamic_linking/DynamicLinkingTest.methodTwo:()V#7 = String             #31            // 方法2执行了#8 = Class              #32            // com/learning/stack/dynamic_linking/DynamicLinkingTest#9 = Class              #33            // java/lang/Object#10 = Utf8               num#11 = Utf8               I#12 = Utf8               <init>#13 = Utf8               ()V#14 = Utf8               Code#15 = Utf8               LineNumberTable#16 = Utf8               LocalVariableTable#17 = Utf8               this#18 = Utf8               Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;#19 = Utf8               methodOne#20 = Utf8               methodTwo#21 = Utf8               SourceFile#22 = Utf8               DynamicLinkingTest.java#23 = NameAndType        #12:#13        // "<init>":()V#24 = NameAndType        #10:#11        // num:I#25 = Class              #34            // java/lang/System#26 = NameAndType        #35:#36        // out:Ljava/io/PrintStream;#27 = Utf8               方法1执行了#28 = Class              #37            // java/io/PrintStream#29 = NameAndType        #38:#39        // println:(Ljava/lang/String;)V#30 = NameAndType        #20:#13        // methodTwo:()V#31 = Utf8               方法2执行了#32 = Utf8               com/learning/stack/dynamic_linking/DynamicLinkingTest#33 = Utf8               java/lang/Object#34 = Utf8               java/lang/System#35 = Utf8               out#36 = Utf8               Ljava/io/PrintStream;#37 = Utf8               java/io/PrintStream#38 = Utf8               println#39 = Utf8               (Ljava/lang/String;)V
{int num;descriptor: Iflags:public com.learning.stack.dynamic_linking.DynamicLinkingTest();descriptor: ()Vflags: ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: bipush        107: putfield      #2                  // Field num:I10: returnLineNumberTable:line 7: 0line 8: 4LocalVariableTable:Start  Length  Slot  Name   Signature0      11     0  this   Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;public void methodOne();descriptor: ()Vflags: ACC_PUBLICCode:stack=3, locals=1, args_size=10: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc           #4                  // String 方法1执行了5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: aload_09: invokevirtual #6                  // Method methodTwo:()V12: aload_013: dup14: getfield      #2                  // Field num:I17: iconst_118: iadd19: putfield      #2                  // Field num:I22: returnLineNumberTable:line 11: 0line 12: 8line 13: 12line 14: 22LocalVariableTable:Start  Length  Slot  Name   Signature0      23     0  this   Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;public void methodTwo();descriptor: ()Vflags: ACC_PUBLICCode:stack=2, locals=1, args_size=10: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc           #7                  // String 方法2执行了5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: returnLineNumberTable:line 17: 0line 18: 8LocalVariableTable:Start  Length  Slot  Name   Signature0       9     0  this   Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;
}
SourceFile: "DynamicLinkingTest.java"
四、字节码说明
4.1 常量池
Constant pool:#1 = Methodref          #9.#23         // java/lang/Object."<init>":()V#2 = Fieldref           #8.#24         // com/learning/stack/dynamic_linking/DynamicLinkingTest.num:I#3 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;#4 = String             #27            // 方法1执行了#5 = Methodref          #28.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V#6 = Methodref          #8.#30         // com/learning/stack/dynamic_linking/DynamicLinkingTest.methodTwo:()V#7 = String             #31            // 方法2执行了#8 = Class              #32            // com/learning/stack/dynamic_linking/DynamicLinkingTest#9 = Class              #33            // java/lang/Object#10 = Utf8               num#11 = Utf8               I#12 = Utf8               <init>#13 = Utf8               ()V#14 = Utf8               Code#15 = Utf8               LineNumberTable#16 = Utf8               LocalVariableTable#17 = Utf8               this#18 = Utf8               Lcom/learning/stack/dynamic_linking/DynamicLinkingTest;#19 = Utf8               methodOne#20 = Utf8               methodTwo#21 = Utf8               SourceFile#22 = Utf8               DynamicLinkingTest.java#23 = NameAndType        #12:#13        // "<init>":()V#24 = NameAndType        #10:#11        // num:I#25 = Class              #34            // java/lang/System#26 = NameAndType        #35:#36        // out:Ljava/io/PrintStream;#27 = Utf8               方法1执行了#28 = Class              #37            // java/io/PrintStream#29 = NameAndType        #38:#39        // println:(Ljava/lang/String;)V#30 = NameAndType        #20:#13        // methodTwo:()V#31 = Utf8               方法2执行了#32 = Utf8               com/learning/stack/dynamic_linking/DynamicLinkingTest#33 = Utf8               java/lang/Object#34 = Utf8               java/lang/System#35 = Utf8               out#36 = Utf8               Ljava/io/PrintStream;#37 = Utf8               java/io/PrintStream#38 = Utf8               println#39 = Utf8               (Ljava/lang/String;)V
4.1 方法调用
  • 1.methodOne方法调用methodTwo方法
9: invokevirtual #6                  // Method methodTwo:()V
  • 2.invokevirtual调用虚方法
  • 3. #6表示Methodref方法引用,指向#8.#30
 #6 = Methodref          #8.#30         // com/learning/stack/dynamic_linking/DynamicLinkingTest.methodTwo:()V
  • 4. #8表示Class
   #8 = Class              #32            // com/learning/stack/dynamic_linking/DynamicLinkingTest
  • 5. #32表示类为com/learning/stack/dynamic_linking/DynamicLinkingTest
  #32 = Utf8               com/learning/stack/dynamic_linking/DynamicLinkingTest
  • 6. #30表示名字和返回类型
  #30 = NameAndType        #20:#13        // methodTwo:()V
  • 7. #20表示名字为methodTwo
  #20 = Utf8               methodTwo
  • 8. #13表示返回类型为void
  #13 = Utf8               ()V
4.3 变量
  • 1. int num = 10;
#2 = Fieldref           #8.#24         // com/learning/stack/dynamic_linking/DynamicLinkingTest.num:I
  • 2. 属性引用,指向#8.#24
  • 3. #8表示Class
   #8 = Class              #32            // com/learning/stack/dynamic_linking/DynamicLinkingTest
  • 4. #32表示类为com/learning/stack/dynamic_linking/DynamicLinkingTest
  #32 = Utf8               com/learning/stack/dynamic_linking/DynamicLinkingTest
  • 5. #24表示名字和类型
  #24 = NameAndType        #10:#11        // num:I
  • 6. #10表示属性名字为num
  #10 = Utf8               num
  • 7. #11表示属性的类型int
  #11 = Utf8               I
4.4 字符串
  • 1. #4表示是字符串
   #4 = String             #27            // 方法1执行了
  • 2. #27表示Utf8的字符串"方法1执行了"
  #27 = Utf8               方法1执行了
4.5 父类Object
  • 1. #1表示方法引用
   #1 = Methodref          #9.#23         // java/lang/Object."<init>":()V
  • 2. #9表示类
   #9 = Class              #33            // java/lang/Object
  • 3. #33表示类名为java/lang/Object
  #33 = Utf8               java/lang/Object
4.6 System类
  • 1. #3表示属性引用
   #3 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;
  • 2. #25表示类
  #25 = Class              #34            // java/lang/System
  • 3. #34表示类名为java/lang/System
  #34 = Utf8               java/lang/System
  • 4. #26表示名称和类型
  #26 = NameAndType        #35:#36        // out:Ljava/io/PrintStream;
  • 5. #35表示名称为out
  #35 = Utf8               out
  • 6. #36表示类型为 Ljava/io/PrintStream
  #36 = Utf8               Ljava/io/PrintStream;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第4天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II

JAVA语言编写 24. 两两交换链表中的节点 谷歌、亚马逊、字节、奥多比、百度 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。…

Openssl数据安全传输平台010:jasoncpp 1.9.5编译及常用API- Windows/Centos8-含测试代码

文章目录 0. 代码仓库1 安装注意版本问题1.1 windows 下的安装1.1.1 使用cmake生成sln工程1.1.2 使用sln工程生成静态库 -Debug 1.2 Linux 下的安装1.2.1 安装jsoncpp1.2.2 旧版本0.10.x版本相关环境配置问题 2 Winsows环境下编译 c 测试文件&#xff1a; json-test.cpp2.1 配置…

nginx请求时找路径问题

nginx请求时找路径问题 你是否遇到过这样的情况&#xff1a; 当你安装了nginx的时候&#xff0c;为nginx配置了如下的location&#xff0c;想要去访问路径下面的内容&#xff0c;可是总是出现404&#xff0c;找不到文件&#xff0c;这是什么原因呢&#xff0c;今天我们就来解…

免登陆 同步脚本 zookeeper kafka集群详细安装步骤

一.免登陆配置 #修改注解名 vim /etc/hostname #修改host文件 vim /etc/hosts 192.168.1.10 kafka1 kafka1 192.168.1.11 kafka2 kafka2 192.168.1.12 kafka3 kafka3#免登陆生成秘钥和授权自动登陆 ssh-keygen -t rsa cd ~/.ssh shh-copy-id kafka1 shh-copy-id kafka2 shh-co…

服务器数据恢复—nas硬盘故障导致raid6失效、存储无法访问的数据恢复案例

服务器故障&分析&#xff1a; 一台nas存储中有一组由十几块硬盘组建的raid6磁盘阵列。 nas存储中的raid6阵列成员盘出现故障离线&#xff0c;磁盘阵列崩溃&#xff0c;nas存储无法正常访问。 北亚企安数据恢复工程师将nas存储内的所有硬盘编号后取出&#xff0c;经过硬件工…

MGRE环境下的OSPF

实验拓扑 需求 1 R6为ISP只能配置IP地址&#xff0c;R1-R5的环回为私有网段 2 R1/4/5为全连的MGRE结构&#xff0c;R1/2/3为星型的拓扑结构&#xff0c;R1为中心站点 3 所有私有网段可以互相通讯&#xff0c;私有网段使用OSPF完成。 IP规划 配置IP R1 # interface GigabitEt…

2023 年四川省职业院校技能大赛(高等职业教育) “信息安全管理与评估”样题

2023年四川省高职院校大学生信息安全管理与评估技能大赛任务书 第一阶段&#xff1a;第二阶段&#xff1a;任务 1 应急响应&#xff08;40分&#xff09;任务 2 操作系统取证&#xff08;40 分&#xff09;任务 3 网络数据包分析&#xff08;50 分&#xff09;任务 4 计算机单机…

Kitex踩坑 [Error] KITEX: processing request error,i/o timeout

报错问题 2023/010/28 17:20:10.250768 default_server_handler.go:234: [Error] KITEX: processing request error, remoteService, remoteAddr127.0.0.1:65425, errordefault codec read failed: read tcp 127.0.0.1:8888->127.0.0.1:65425: i/o timeout 分析原因 Hert…

Ps:对象选择工具

对象选择工具 Object Selection Tool是 Photoshop 2020 版以后新增的选区工具&#xff0c;可用于自动选择图像中的对象或区域&#xff0c;如人物、汽车、宠物、天空、水、建筑物和山脉等。 快捷键&#xff1a;W 让对象选择工具自动检测并选择图像内的对象或区域&#xff0c;或者…

3.7 移动端TB(D)R架构基础

一、各类电子设备功耗对比 桌面级主流性能平台&#xff0c;功耗一般为300W&#xff08;R7/I7X60级别显卡&#xff09;&#xff0c;游戏主机150-200W入门和旗舰游戏本平台功耗为100W主流笔记本为50-60W&#xff0c;超极本为15-25W&#xff0c;旗舰平板为8-15W旗舰手机为5-8W&am…

【Linux】部署单体项目以及前后端分离项目(项目部署)

一、简介 以下就是Linux部署单机项目和前后端分离项目的优缺点&#xff0c;希望对你有所帮助。 1、Linux部署单机项目&#xff1a; 优点&#xff1a; 1.简化了系统管理&#xff1a;由于所有服务都在同一台机器上运行&#xff0c;因此可以简化系统管理和维护。 2.提高了性能&a…

记录使用阿里 ARoute 遇到的坑

1.按照官方一个配置好之后 尝试使用 跳转出现 Aroute Theres no route matched path"" 我这边遇到的坑是配置问题 kotiln 使用了 Java的配置 plugins {id("com.android.application")id("org.jetbrains.kotlin.android")id("kotlin-kapt&…

Linux mv命令:移动文件或改名

mv 命令&#xff08;move 的缩写&#xff09;&#xff0c;既可以在不同的目录之间移动文件或目录&#xff0c;也可以对文件和目录进行重命名。该命令的基本格式如下&#xff1a; [rootlocalhost ~]# mv 【选项】 源文件 目标文件 -f&#xff1a;强制覆盖&#xff0c;如果目标文…

在Spring boot中 使用JWT和过滤器实现登录认证

在Spring boot中 使用JWT和过滤器实现登录认证 一、登录获得JWT 在navicat中运行如下sql,准备一张user表 -- ---------------------------- -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id int(11) …

matlab simulink 直线一级倒立摆控制(自起摆和稳态控制)

1、内容简介 略 6-可以交流、咨询、答疑 2、内容说明 控制器设计 自起摆建模 规定正方向&#xff1a;顺时针为角度&#xff08;力矩&#xff09;正方向&#xff0c;向右为位移正方向。 在规定的正方向条件下&#xff0c;图 1 所示摆杆的角度φ为正值&#xff0c; 下车向右加…

NetSuite数据备份办法

本周有同学问有啥办法可以实现NetSuite的数据备份&#xff1f;这是个常见问题&#xff0c;今天总结一下。 我们认为可以选择的技术路线有下面几个&#xff1a; 从技术可行性、数据可利用角度&#xff0c;毫无疑问我们将推荐第三种办法。所以&#xff0c;今朝就介绍一下。 Ana…

AcWing90. 64位整数乘法

题目 求 a a a 乘 b b b 对 p p p 取模的值。 输入格式 第一行输入整数 a a a&#xff0c;第二行输入整数 b b b&#xff0c;第三行输入整数 p p p。 输出格式 输出一个整数&#xff0c;表示 a*b mod p 的值。 数据范围 1 ≤ a , b , p ≤ 1 0 18 1≤a,b,p≤10^{18…

vue项目播放rtsp流视频。

下载webtrc-streamer的压缩包&#xff0c;在github上有 https://github.com/mpromonet/webrtc-streamer/releases 将下载包html文件夹下webrtcstreamer.js文件和html/libs文件夹下adapter.min.js文件复制到VUE项目public/stactic目录下&#xff0c;在index.html文件里引入这两个…

[2021]不确定成本下的处理分配

英文题目&#xff1a;Treatment Allocation under Uncertain Costs 中文题目&#xff1a;不确定成本下的处理分配 单位&#xff1a;swager、uber 时间&#xff1a;2021 论文链接&#xff1a;https://arxiv.org/pdf/2103.11066.pdf 代码&#xff1a; 摘要&#xff1a; 我…

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

1 bug描述 使用vscode执行npm run dev指令时出现 “npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次 “ 的错误提示&#xff0c;原因是系统里没有安装n…