Java 理解打印某些内容的字节码
请说明此字节码将打印什么Java 理解打印某些内容的字节码,java,bytecode,Java,Bytecode,请说明此字节码将打印什么 BIPUSH 10 BIPUSH 7 IXOR ISTORE 1 IINC 1 19 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; ILOAD 1 INVOKEVIRTUAL java/io/PrintStream.println (I)V 我强烈建议阅读JVM规范,它解释了一切 看看你的具体例子 BIPUSH 10 这会将10推到堆栈上 BIPUSH 7 ILOAD 1 INVOKEVIRTUAL
BIPUSH 10
BIPUSH 7
IXOR
ISTORE 1
IINC 1 19
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
我强烈建议阅读JVM规范,它解释了一切 看看你的具体例子
BIPUSH 10
这会将10推到堆栈上
BIPUSH 7
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
这会将7推到堆栈上。堆栈现在是10 7
IXOR
这是前两个元素的XOR。堆栈现在是10^7=13
ISTORE 1
这将顶部元素存储在局部变量插槽1中。堆栈现在为空,而局部变量为[无效,13]
IINC 1 19
这将本地1增加19。当地人现在[无效,32]
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
这会将System.out推到堆栈上
BIPUSH 7
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
这会将变量加载到堆栈中
BIPUSH 7
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
这是打印出来的。因此,最终结果是打印32
这个字节码可能是由Java代码生成的,如下所示
int x = 10 ^ 7;
x += 19;
System.out.println(x);
我强烈建议阅读JVM规范,它解释了一切 看看你的具体例子
BIPUSH 10
这会将10推到堆栈上
BIPUSH 7
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
这会将7推到堆栈上。堆栈现在是10 7
IXOR
这是前两个元素的XOR。堆栈现在是10^7=13
ISTORE 1
这将顶部元素存储在局部变量插槽1中。堆栈现在为空,而局部变量为[无效,13]
IINC 1 19
这将本地1增加19。当地人现在[无效,32]
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
这会将System.out推到堆栈上
BIPUSH 7
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
这会将变量加载到堆栈中
BIPUSH 7
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
这是打印出来的。因此,最终结果是打印32
这个字节码可能是由Java代码生成的,如下所示
int x = 10 ^ 7;
x += 19;
System.out.println(x);
谢谢你帮了大忙!也许你可以建议一些资源从一开始就了解JVM?JVM规范是最好的资源。这就是我的出发点。很难,如果不是不可能的话,找到产生字节码的等价Java代码,因为Java处理常量值的方式。任何阻止Java编译器将
10^7
视为编译时常量的尝试都会导致生成额外的字节码指令。关于JVM规范,…感谢大家的回答@Holger我不记得常量表达式优化是否适用于这样的位运算。但无论如何,对于不懂字节码的人来说,它仍然是最容易理解的等价物。谢谢!你帮了大忙!也许你可以建议一些资源从一开始就了解JVM?JVM规范是最好的资源。这就是我的出发点。很难,如果不是不可能的话,找到产生字节码的等价Java代码,因为Java处理常量值的方式。任何阻止Java编译器将10^7
视为编译时常量的尝试都会导致生成额外的字节码指令。关于JVM规范,…感谢大家的回答@Holger我不记得常量表达式优化是否适用于这样的位运算。但无论如何,对于不懂字节码的人来说,它仍然是最容易理解的等价物。