Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解打印某些内容的字节码_Java_Bytecode - Fatal编程技术网

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我不记得常量表达式优化是否适用于这样的位运算。但无论如何,对于不懂字节码的人来说,它仍然是最容易理解的等价物。