当前位置: 首页 > 面试题库 >

用Java字节码转到

汪德寿
2023-03-14
问题内容

因此,有一天,当我在Wikipedia页面上查看Java字节码时,遇到了以下示例:

考虑以下Java代码:

  outer:
  for (int i = 2; i < 1000; i++) {
      for (int j = 2; j < i; j++) {
          if (i % j == 0)
          continue outer;
     }
     System.out.println (i);
  }

假设将上述代码放在方法中,Java编译器可能会将上述Java代码转换为字节代码,如下所示:

  0:   iconst_2
  1:   istore_1
  2:   iload_1
  3:   sipush  1000
  6:   if_icmpge       44
  9:   iconst_2
  10:  istore_2
  11:  iload_2
  12:  iload_1
  13:  if_icmpge       31
  16:  iload_1
  17:  iload_2
  18:  irem
  19:  ifne    25
  22:  goto    38
  25:  iinc    2, 1
  28:  goto    11
  31:  getstatic       #84; //Field java/lang/System.out:Ljava/io/PrintStream;
  34:  iload_1
  35:  invokevirtual   #85; //Method java/io/PrintStream.println:(I)V
  38:  iinc    1, 1
  41:  goto    2
  44:  return

而且我注意到,很少有goto出现过几次,这在检查JVM规范时是有效的。
我的问题是为什么?
GOTO在Java中是一个保留的但无法使用的关键字,因此为什么在编写和编译Java代码时似乎会使用goto将其编译回去。我想知道这仅仅是在较低级别的编程中总是会做的事情,还是因为JVM被信任可以更有效地使用goto字。最终,我对为什么goto被认为是一种不好的做法感到好奇,以至于Java代码中禁止使用goto,但是似乎在编译时直接将其放回了您的代码中。


问题答案:

诸如循环(for/ while)之类的Java结构化编程功能是在字节码级别使用条件分支(IF..)和无条件跳转(GOTO)指令实现的。

break``continue在结构化编程中,也可以认为Java语言具有这些功能(中断/继续标记),对于外部循环或外部循环也被认为足够有用且合法。

在JVM /字节码级别,这些也可以通过实现GOTO

看到:

  • https://zh.wikipedia.org/wiki/Java_bytecode_instruction_listings
  • http://www.artima.com/underthehood/flowP.html


 类似资料:
  • 问题内容: 我正在寻找用Java字节码编写一个简短的程序(也许是Hello World)。我只想使用我的文本编辑器编写字节码并运行它。我该怎么做?有一个例子吗?谢谢! 问题答案: 您可以尝试茉莉! 您可以使用以下命令进行编译: 然后像任何类一样运行它: 更新资料 我看到您的问题提到“不使用Javac或Java”。您能说明一下该声明的意思吗?

  • 我一直在测试char casting,我经历了以下几点: 有人能解释为什么我在1中给字节添加了一个final时它工作得很好吗?

  • 问题内容: 我一直在测试字符转换,并经历了以下过程: 任何人都可以解释为什么当我在字节中添加final后在1中可以正常工作吗? 问题答案: 当变量为时,编译器将自动内联其值为1的值。该值可表示为,即: 相当于 实际上,根据本节中有关变量的部分,将其视为常量: 原始类型或类型的变量,即,用一个编译时间常量表达式(§15.28)初始化,被称为 恒定变量 。

  • 问题内容: 我经常卡在没有源的Java类文件中,并且试图理解我手头的问题。 请注意,反编译器是有用的,但在所有情况下都不足够… 我有两个问题 有哪些工具可用来查看Java字节码(最好从linux命令行中获得) 什么是熟悉Java字节码语法的良好参考 问题答案: 与其直接查看Java字节码(需要熟悉Java虚拟机及其操作),不如尝试使用Java反编译实用程序。反编译器将尝试从指定文件创建源文件。 该

  • 问题内容: 我的编译器类正在创建一种我们打算编译为Java字节码的语言。我们已经取得了很大的进步,并且正在接近代码生成的时间。 我们在查找有关如何从编译器创建.class文件的信息时遇到问题。您有什么资源可以为我们提供帮助吗?我们已经有很多关于指令集的文档,但是需要有关如何直接填写类文件/十六进制编写的信息。 我们不需要有关反编译.class文件的信息或建议。 即使是从头开始编写.class文件的

  • 问题内容: 我有一个字节数组。我希望将该数组的每个字节String转换为其对应的十六进制值。 Java中是否有任何函数可以将字节数组转换为十六进制? 问题答案: 也可以看看 java.util.Formatter syntax %[flags][width]conversion Flag ‘0’ - The result will be zero-padded Width 2 Conversion