java – LDC指令代码的负值是什么意思?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – LDC指令代码的负值是什么意思?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2404字,纯文字阅读大概需要4分钟。
内容图文
![java – LDC指令代码的负值是什么意思?](/upload/InfoBanner/zyjiaocheng/729/cfb510b05c764187a739ede7f32bd36c.jpg)
我是java字节码世界的新手.我有一些涉及字节码的调试任务.经过时我注意到一些看起来很可疑的值,但我不确定.这是完整字节码的一部分
// access flags 0x100A
private static synthetic $jacocoInit()[Z
GETSTATIC ClassUnderTest.$jacocoData : [Z
DUP
IFNONNULL L0
POP
LDC -1475355800743669619
LDC "ClassUnderTest"
BIPUSH 64
INVOKESTATIC org/jacoco/agent/rt/internal_1f1cc91/Offline.getProbes (JLjava/lang/String;I)[Z
DUP
PUTSTATIC ClassUnderTest.$jacocoData : [Z
L0
LDC -1475355800743669619就是我所关注的.到目前为止我学到的是,这是一个类中常量值的字段.
如果LDC值可能是否定的,我很困惑?
我遇到的另一个问题是,使用JDK-8,同一类的LDC值为正,但JDK-11为负值.所以我的问题是,它还依赖于JDK吗?
解决方法:
Java程序集没有标准化格式,因此可能存在差异,具体取决于您用于获取文本格式的工具.
显然,您使用的工具不会打印LDC指令使用的常量池索引(确实必须为正),而是来自池的实际常量值.最强的指标是后续指令,显示实际的String值而不是常量池索引.
这适用于随后调用getProbes(JLjava / lang / String; I),它需要在堆栈上使用long,String和int.
> LDC -1475355800743669619在堆栈上推送文字长值-1475355800743669619,该值有效,因为-1475355800743669619适合长值范围(已签名)
> LDC“ClassUnderTest”将对表示“ClassUnderTest”的String的引用推送到堆栈
> BIPUSH 64将文字int值64推送到堆栈
那么,你在堆栈上有一个long,一个String和一个int来调用getProbes.
由于long值是getProbes的第一个参数的参数,因此方法getProbes确定其含义以及负值或正值是否是合理的参数,以及JDK 8或JDK 11的值是否必须相同.
https://www.jacoco.org/jacoco/trunk/doc/implementation.html说:
Each class loaded at runtime needs a unique identity to associate coverage data with. JaCoCo creates such identities by a CRC64 hash code of the raw class definition.
如果这是我们在这里看到的长值,那么重新编译具有不同JDK版本的类可能会改变实际值,而负值则完全合理.
请注意,如果您使用javap来获取文本输出,它看起来更像
0: getstatic #42 // ClassUnderTest.$jacocoData : [Z
3: dup
4: ifnonnull 22
7: pop
9: ldc2_w #43 // long -1475355800743669619l
11: ldc #44 // String ClassUnderTest
13: bipush 64
15: invokestatic #45 // org/jacoco/agent/rt/internal_1f1cc91/Offline."getProbes":(JLjava/lang/String;I)[Z
18: dup
19: putstatic #42 // ClassUnderTest.$jacocoData : [Z
确实在行尾用注释表单显示正常量池索引和实际值.当然,我只是编写了数字,因为我没有原始的类文件.这仅仅是为了说明答案开头所述的事实,Java程序集输出没有标准化的形式.您可以在实际的字节代码上运行javap.
内容总结
以上是互联网集市为您收集整理的java – LDC指令代码的负值是什么意思?全部内容,希望文章能够帮你解决java – LDC指令代码的负值是什么意思?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。