Java 如果ICMPNE是什么意思?

Java 如果ICMPNE是什么意思?,java,jvm,bytecode,jvm-bytecode,Java,Jvm,Bytecode,Jvm Bytecode,对于以下Java类: public class ArtClass { public boolean foo(int x) { if(x == 3956681) return true; else if(x == 9855021) return true; else if(x == 63085561) return true; else return false; } }

对于以下Java类:

public class ArtClass {
   public boolean foo(int x) {
      if(x == 3956681)
        return true;
      else if(x == 9855021)
        return true;
      else if(x == 63085561)
          return true;
      else
        return false;
   }
}
其JVM指令如下:

I4 Branch 1 IF_ICMPNE L3
I13 Branch 2 IF_ICMPNE L5
I22 Branch 3 IF_ICMPNE L7
我知道第一个分支位于第三行,第二和第三个分支相同,但IF_ICMPNE是什么意思,I4、I13和I22是什么意思?

这里有一个文档:

如果icmpne:

这里有一份文件:

如果icmpne:

这是输出,javap-c为您的类生成javap是每个标准JDK附带的工具:

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

  public boolean foo(int);
    Code:
       0: iload_1
       1: ldc           #2                  // int 3956681
       3: if_icmpne     8
       6: iconst_1
       7: ireturn
       8: iload_1
       9: ldc           #3                  // int 9855021
      11: if_icmpne     16
      14: iconst_1
      15: ireturn
      16: iload_1
      17: ldc           #4                  // int 63085561
      19: if_icmpne     24
      22: iconst_1
      23: ireturn
      24: iconst_0
      25: ireturn
}
所有说明的含义已在附录中规定。指令将弹出两个int值,比较它们,如果不相等,则分支到指定的目标

javap的输出非常清楚,分支指令指定了哪些目标,因为它们与每条指令之前打印的数字相匹配

如果使用不同的工具生成不同的输出,则必须参考该工具的文档,了解如何解密输出。与javap的输出相比,这些前缀(如I4)也表示字节码偏移量,但没有进一步的上下文,例如看到该方法的其他指令,这毫无意义

这是输出,为类生成的javap-c javap是每个标准JDK附带的工具:

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

  public boolean foo(int);
    Code:
       0: iload_1
       1: ldc           #2                  // int 3956681
       3: if_icmpne     8
       6: iconst_1
       7: ireturn
       8: iload_1
       9: ldc           #3                  // int 9855021
      11: if_icmpne     16
      14: iconst_1
      15: ireturn
      16: iload_1
      17: ldc           #4                  // int 63085561
      19: if_icmpne     24
      22: iconst_1
      23: ireturn
      24: iconst_0
      25: ireturn
}
所有说明的含义已在附录中规定。指令将弹出两个int值,比较它们,如果不相等,则分支到指定的目标

javap的输出非常清楚,分支指令指定了哪些目标,因为它们与每条指令之前打印的数字相匹配


如果使用不同的工具生成不同的输出,则必须参考该工具的文档,了解如何解密输出。与javap的输出相比,这些前缀(如I4)也表示字节码偏移量,但没有进一步的上下文,例如看到该方法的其他指令,这毫无意义

这可能是完全错误的,但我想猜测,如果整型比较不相等,那么ICMPNE是否意味着通常不喜欢lmgtfy答案/注释,但是。。。你试过谷歌搜索IF_ICMPNE吗?这就给了我答案。如果你的谷歌搜索结果与我的不同,你可能需要搜索类似java的东西。@yshavit这也是关于I4、I13、I22的。“我不能理解它们。@AdamAmin如果这是你不理解的部分,你应该编辑问题正文和标题来反映它。如前所述,主要问题是关于IF_ICMPNE。至于这些,我怀疑但不确定它们只是告诉您指令集中的字节偏移量。这是第4字节的指令,第13字节的指令,等等。你还应该发布你用来查看这些的工具,因为例如javap的格式稍有不同。@yshavit开你玩笑,当你谷歌if_icmpne是这个页面的时候,第一件事出现了,这可能是完全错误的,但是我想猜测,如果整数比较不相等,那么Icu ICMPNE是否意味着IF Integer Compare Not Equal通常不喜欢lmgtfy答案/注释,但是。。。你试过谷歌搜索IF_ICMPNE吗?这就给了我答案。如果你的谷歌搜索结果与我的不同,你可能需要搜索类似java的东西。@yshavit这也是关于I4、I13、I22的。“我不能理解它们。@AdamAmin如果这是你不理解的部分,你应该编辑问题正文和标题来反映它。如前所述,主要问题是关于IF_ICMPNE。至于这些,我怀疑但不确定它们只是告诉您指令集中的字节偏移量。这是第4字节的指令,第13字节的指令,等等。您还应该发布您正在使用的工具来查看这些内容,因为例如javap的格式稍有不同。@yshavit跟您开玩笑,当您搜索if_icmpne是这个页面时,首先出现的是lolHi Holger,如果不相等,则分支到指定的目标。分支意味着跳跃?像“后藤”这样的句子?Thanks@DiegoRamos是的,分支意味着“在指定的位置继续执行”,就像goto是一条无条件的分支指令一样。Hi Holger,如果不相等,则分支到指定的目标。分支意味着跳跃?像“后藤”这样的句子?Thanks@DiegoRamos是的,分支意味着“在指定位置继续执行”,就像goto是无条件分支指令一样。