Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java字节码初学者的问题:"istore“变量使用顺序、”字节用法“等

Java字节码初学者的问题:"istore“变量使用顺序、”字节用法“等
EN

Stack Overflow用户
提问于 2016-01-01 11:00:22
回答 1查看 1.1K关注 0票数 3

我有以下Java代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void fun(int[] a) {

    int min;

    for(int j=0;j<a.length-1;j++) {
        min=j;

        for(int i=j+1;i<a.length;i++) 
            if(a[i]<a[min]) min=i;

        if(min!=j) {
            int temp = a[j];
            a[j] = a[min];
            a[min]=temp;
        }
    }
}

我在上面的代码生成的类文件上使用了javap -c来打印上面程序的Java字节码,我得到了下面的输出:

0: iconst_0 1: istore_2 2: iload_2 3: aload_0 4:芳纶 5: iconst_1 6: isub 7: if_icmpge 64 10: iload_2 11: istore_1 12: iload_2 13: iconst_1 14: iadd 15: istore_3 16: iload_3 17: aload_0 18:芳纶 19: if_icmpge 39 22: aload_0 23: iload_3 24: iaload 25: aload_0 26: iload_1 27: iaload 28: if_icmpge 33 31: iload_3 32: istore_1 33: iinc 3,1 36: goto 16 39: iload_1 40: iload_2 41: if_icmpeq 58 44: aload_0 45: iload_2 46: iaload 47: istore_3 48: aload_0 49: iload_2 50: aload_0 51: iload_1 52: iaload 53:最近 54: aload_0 55: iload_1 56: iload_3 57:中东 58: iinc 2,1 61: goto 2 64:返回

我的问题主要涉及istore命令。如您所见,在"1:“处生成的字节码是istore_2。在这种情况下,为什么使用istore_2而不是istore_0istore_1?正如我们稍后所看到的,在"11:“中,使用了istore_1,但是istore_0没有使用。这是否有原因,为什么变量2在开始使用,变量1在以后使用?

很抱歉,如果上面的措辞很糟糕,我现在才刚刚开始在大学学习Java字节码。

此外,我还试图从我们必须学习使用的列表中找出哪些命令使用多个字节。这是一个列表,有人能验证下命令中的“字节用法”(我不确定正确的术语)是否正确(我们必须在考试中手动转换,使用下面给出的命令列表,我需要知道每个命令使用了多少字节-在我们的讲座中解释得非常糟糕,而且讲师没有在线注释)。

"aload_n“-1字节 "iconst_n“-1字节 "iaload"- 1字节 "istore_n"- 1字节 "arraylength"- 1字节 "if_icmpge"- 3个字节 "if_icmple"- 3个字节 "iinc i“-不确定?3个字节? "goto n“-3个字节? “我返回”-1字节

最后,我相信goto n使用3个字节(如上面所述),但是,有人能解释一下为什么会这样吗?

非常感谢你的帮助,我意识到这是一个很长的问题!劳伦

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-01 11:16:13

关于字节的使用,您可以参考规格说明。引用开头的注释:“指令格式图中的每个单元格表示单个8位字节”,因此应该很容易获得每条指令的大小。

如您所见,在"1:“处生成的字节码是"istore_2”。在这种情况下,为什么使用"istore_2“而不是"istore_0”或"istore_1"?

仅仅因为在第1行,字节码将值为零存储到局部变量j (恰巧在索引2处)。类似地,istore_1将操作数堆栈上的值存储到索引1处的局部变量(在本例中为min)。

这是因为,长话短说,每个方法都分配了一个包含局部变量的堆栈帧,可以通过编译时分配的索引访问。

对于goto指令,这也在规格说明

转到 branchbyte1 branchbyte2 无符号字节branchbyte1和branchbyte2用于构造带符号的16位分支偏移量,其中分支偏移量为(branchbyte1 << 8) _\_\从这个goto指令的操作码地址开始执行该偏移量。目标地址必须是包含此goto指令的方法中指令的操作码的地址。

操作码后有两个字节,构成16位偏移量.生成的目标地址计算如下:

target_address = address_of_current_goto + 16_bit_offset

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34559067

复制
相关文章
maven pom文件配置加载lib下的jar包
项目需要引用第三方放在lib的jar,所以需要进行配置,不过最好还是放在公司自己的maven私服里
SmileNicky
2022/05/07
1K0
maven加载lib下的jar包
           <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-compiler-plugin</artifactId>                 <version>3.7.0</version>                 <configuration>                     <source>1.8</source>
似水的流年
2019/12/07
1.2K0
maven工具引入lib下的jar文件
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable><!-- 直接运行,注册服务 -->
JQ实验室
2022/02/10
6770
maven依赖json-lib的jar包导入失败
maven仓库中配置了中央仓库http://central.maven.org/maven2/的镜像,但是json-lib包还是引入失败:
青山师
2023/05/05
7520
maven打包出来的jar包引入的其他jar包版本不是pom文件配置的版本
        项目上使用flyway来管理数据库版本,但是遇到了一件奇怪的事,这件事发生的时间点是springboot从2.3.12升级到2.6.7版本,升级后到底发生了什么,到底是谁引入了flyway 8.0.5版本呢,博主在pom中显示引入的flyway版本为7.1.1,在这个公共jar包里面执行mvn dependency:tree看到的flyway版本也是7.1.1,为什么这个公共jar包被其他项目引入后执行mvn dependency:tree却显示 flyway的版本为8.0.5,而且显示也是由这个公共jar包引入的。
johnhuster的分享
2023/10/16
3260
解决:打包SpringBoot项目成jar包后,其他的项目无法引入jar包中的对象
需求描述 因为最近想把一块东西封装成一个jar包,这样的话,在多个项目中就可以公共了。 就创建了一个SpringBoot项目,去掉了web模块。 遇到的问题 使用maven打包之后,但是其他引入了这个
手撕代码八百里
2020/10/26
2K0
解决SpringBoot jar包中的文件读取问题
SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档、导出模版等),本地开发时可以正常读取 ,但是,当我们打成jar包发布到服务器后,再次执行程序时就会抛出找不到文件的异常。
程序员小明
2020/08/27
3.2K0
maven打包时打包指定的lib文件夹
然后cmd切换到项目根路径执行打包命令:mvn clean package -Dmaven.test.skip=true
全栈程序员站长
2022/09/02
3.3K0
maven中 引入jar报错:Missing artifact net.sf.json-lib:json-lib:jar:2.4
今天要引入json包,发现报了这个错 Missing artifact net.sf.json-lib:json-lib:jar:2.4 一开始以为是本地仓库从中央仓库下载jar的时间过久的时候,我直接强制终止了,导致从中央仓库下载jar包失败,然后我把本地仓库 net.sf.json-lib:json-lib的文件夹删了,重新导入还是不行
秋白
2019/02/21
3.2K0
maven中 引入jar报错:Missing artifact net.sf.json-lib:json-lib:jar:2.4
包和 jar 文件的创建
在之前的文章中,讲到了面向的 3 大特性(封装、继承、多态)和面向对象设计的 5 大原则(SRP、OCP、LSP、DIP、ISP)。此外,我们还讲了如何创建一个类,并且在创建类后如何构造一个对象。然后还介绍了类中的属性和方法,并对构造方法和引用也做了简单的讲解。
村雨遥
2022/10/28
9020
包和 jar 文件的创建
jar包为什么要放在web-inf的lib下?
为什么jar包一定放在lib文件夹下面,我换个地方就不行。这个其实如果你不是用服务器是没有任何问题的,但是当你使用了web服务器类似于tomcat这种,那么你就要小心了。jar包导入工作空间这个是由我们人为控制的,我导哪个空间就有哪个,我不导行不行,可以,编译器会自动去寻找他所需要的jar包,但是服务器就不会他只会去寻找lib文件夹下的jar包并将他们拷贝到服务器上(就是在你服务器的当前项目的lib文件夹)
wuweixiang
2018/08/14
1.3K0
jar包为什么要放在web-inf的lib下?
android 自己制作Jar包 和 修改 现成的 Jar包文件
先看如何创建自己的 Jar 包 里面随便写个方法 public int add(int a,int b){ return (a+b); } task makeJar(type:
杨奉武
2019/10/03
1.5K0
Roslyn 打包 NuGet 包 BuildTransitive 文件夹用于穿透依赖传递拷贝文件
默认的 PackageReference 可以实现传递依赖,传递依赖的含义是是假定 B 项目安装了 A 库,而 C 项目依赖 B 项目,那么 C 项目将会自然拿到 A 库的 DLL 引用。但默认的 NuGet 包的构建指导文件 targets 命令是不会在传递执行的,也就是如上的 C 项目将不会执行 B 项目安装的 A 库里面的 target 内容 有一些项目需要拷贝自定义文件,例如拷贝图片或者一些 Native 的 DLL 等资源。如 WPF 框架需要拷贝 PenIME 等资源。如果只是在最底层的项目安装了库,那为了让可执行文件项目也输出库的资源,就需要在可执行项目上也安装库。以上的方法的不足在于安装复杂,也许会忘记安装 本文告诉大家一个解决方法是通过在制作库的时候,加上 BuildTransitive 文件夹,在此文件夹内添加构建指导文件,此时这个构建指导文件 targets 文件里面的命令将会在传递中执行,也就是说只需要在底层的项目安装即可,不需要在可执行项目上也安装库
林德熙
2021/12/24
7250
为什么SpringBoot jar包中的文件读取不到?
菜菜同学每天的工作便是与三方对接,而且这次的任务是接入 N 套证书相关配置文件。考虑到后期易于上线,于是菜菜开启了从硬编码到易维护的代码优化之路。
一猿小讲
2021/10/08
1.4K0
python引入其他文件夹里的py文件的方法
在写python框架的时候,经常会用到引入其他文件夹里的python文件,要是都在同目录下的还好,直接import就好了,可是有的不在同一个目录,很多初学者就发现直接import报错了 1.如果是同目录下的引入
matinal
2023/10/13
8080
python引入其他文件夹里的py文件的方法
Intellij idea打带Manifest文件的jar包(可执行jar包)
老版本Intellij idea可以很方便地打带Manifest文件的jar包,也就是可行性的Jar包。今天使用新版的Intellij idea打jar包时遇到了坑,jar包中竟然没有MANIFEST文件。
程裕强
2019/05/27
4.8K0
根据包名查找 Jar 包文件
很多时候,我们需要根据包名来查找一些依赖所在的jar包,比如我们想要查找com.alipay这个包及其文件所在的jar包。
技术小黑屋
2020/01/19
2.3K0
Linux怎么复制文件到其他文件夹
本文主要讲解linux怎么复制文件到其他文件夹。 在Linux和Unix系统上工作时,复制文件和目录是您每天要执行的最常见任务之一。 cp是一个命令行实用程序,用于复制Unix和Linux系统上的文件和目录。在本文中,我们将解释如何使用cp命令。
狼啸风云
2021/04/13
15.8K0
操作 PDF 文件的常用JAR包
iText 5是最早一个提供对PDF进行操作的JAR包,不过目前该JAR已经不再进行后续开发。可以从官网看到如下一段话:
BUG弄潮儿
2020/12/02
2.6K0
获取当前jar包路径_java获取jar文件
获取classpath的路径,若没有其他依赖,在cmd下运行该可执行jar包,则该值即为该jar包的绝对路径。代码如下:
全栈程序员站长
2022/11/10
7.5K0

相似问题

取消订阅时事通讯

22

Magento -订阅和取消订阅时事通讯无事件

42

Zencart订阅时事通讯

11

如何使用Sitecore 8.1、WFFM和EXM配置时事通讯订阅

14

时事通讯订阅与注册

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文