加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

javap输出中缺少指令编号

发布时间:2020-12-15 04:18:49 所属栏目:Java 来源:网络整理
导读:每当我尝试理解已编译的 Java文件的反汇编代码时,我都想知道为什么缺少某些指令编号. 一个小例子: 我反汇编($javap -c HelloWorld)一个简单的HelloWorld类.这是输出: Compiled from "HelloWorld.java"public class HelloWorld { public HelloWorld(); Code
每当我尝试理解已编译的 Java文件的反汇编代码时,我都想知道为什么缺少某些指令编号.

一个小例子:

我反汇编($javap -c HelloWorld)一个简单的HelloWorld类.这是输出:

Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return        
}

如您所见,构造函数中的指令3和4以及main方法中的一些指令都缺失.

有人知道为什么这些指令编号丢失了吗?是否有一些由于某种原因隐藏的字节码指令?

解决方法

“漏洞”是当前指令的参数,参见 Java Virtual Machine Specification.它包含 Chapter 6中的完整字节码列表.

例如,invokevirtualinvokespecial都采用2个参数,因此下一个操作码将在3个字节后找到.在这两种情况下,需要参数(indexbyte1和indexbyte2)来计算常量池中的位置(indexbyte1<< 8)| indexbyte2) Javap为您查找这些值,这是实际指令后的注释中的引用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读