首页 > 解决方案 > 了解打印某些东西的字节码

问题描述

请帮助这个字节码将打印什么

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

标签: javabytecode

解决方案


我强烈建议阅读 JVM 规范,它解释了一切。

浏览您的具体示例

BIPUSH 10

这会将 10 推入堆栈

BIPUSH 7

这会将 7 推入堆栈。堆栈现在是 10 7

IXOR

这对前两个元素进行异或。堆栈现在是 10^7 = 13

ISTORE 1

这将顶部元素存储在局部变量槽 1 中。堆栈现在是空的,而局部变量是 [INVALID, 13]

IINC 1 19

这会将本地 1 增加 19。本地现在是 [INVALID, 32]

GETSTATIC java/lang/System.out : Ljava/io/PrintStream;

这会将 System.out 推入堆栈

ILOAD 1

这会将变量加载到堆栈中

INVOKEVIRTUAL java/io/PrintStream.println (I)V

这会打印出来。所以最终的结果是打印32

该字节码可能是由 Java 代码按照以下行生成的

int x = 10 ^ 7;
x += 19;
System.out.println(x);

推荐阅读