2

如果我没记错的话,似乎Java中的所有控制流字节码

喜欢

ifeq
goto

其他的是直接跳转指令。

我的问题是,Java 中是否有任何“间接跳转”指令?

如果没有,我如何使用 JavaByte 代码在 Java 中模拟“间接跳转”,就像在汇编中我们可以这样做:

goto address;  // we can only know address at runtime

谢谢

- - - - - - - - - 更新 - - - - - - - - - - - - -

基本上,我想做的是在运行时更改我的控制流,但是由于控制流字节码的目标在编译时是硬编码的,这似乎是不可能的..

4

3 回答 3

3

间接跳转会使字节码验证器失败。阅读如何验证类文件(在JVM 规范中),您就会明白为什么。

特别是,以下内容将无法验证:

  • 所有控制流指令的目标必须是指令的开始(不能跳转到指令的中间)

  • 无论虚拟机如何到达该点,堆栈在特定指令处必须保持一致(相同的高度和值类型)。

于 2013-10-22T20:34:20.353 回答
1

编辑:完全错误地回答了这个问题。(见下文)

JVM 在字节码级别支持 goto。你只需要像这样的库

BCEL


原始答案,goto在源代码中:

最初Java有 goto 语句,但后来的版本没有它。我认为可能的原因可能goto是不必要的,可以用更具可读性的陈述代替

goto 关键字存在,但未实现。

查看James Gosling的这个有趣的视频

于 2013-10-22T19:51:09.780 回答
0

根据您的定义,任何形式的方法调用都是“间接跳转”。

于 2013-10-22T19:50:55.250 回答