Java ByteCode是否具有“间接跳跃”?

时间:2013-10-22 19:47:34

标签: java assembly x86 bytecode

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

喜欢

ifeq
goto

和其他人是直接跳转说明。

我的问题是,Java中是否存在“间接跳转”指令?

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

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

谢谢

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

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

3 个答案:

答案 0 :(得分:3)

间接跳转会使字节码验证程序失败。阅读有关如何验证类文件的信息(在JVM spec中),您将看到原因。

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

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

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

答案 1 :(得分:1)

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

JVM支持转到字节码级别。您只需要

BCEL

等库

原始答案,源于goto源代码:

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

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

通过James Gosling

查看这个有趣的视频

答案 2 :(得分:0)

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