首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ByteCode是否有“间接跳转”?

Java ByteCode是否有“间接跳转”?
EN

Stack Overflow用户
提问于 2013-10-22 19:47:34
回答 3查看 573关注 0票数 2

如果我没有错的话,似乎所有控制流字节码都是用Java编写的

喜欢

代码语言:javascript
复制
ifeq
goto

还有一些是直接跳转指令。

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

如果不是,我如何使用JavaByte代码模拟Java中的“间接跳转”,比如在程序集中,我们可以这样做:

代码语言:javascript
复制
goto address;  // we can only know address at runtime

谢谢

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-22 20:34:20

间接跳转将使字节码验证器失败。了解如何验证类文件(在JVM规范中),您将看到其中的原因。

具体而言,无法核实以下情况:

  • 所有控制流指令的目标必须是指令的开始(不能跳入指令的中间)。
  • 无论VM如何达到这一点,堆栈必须在特定指令中保持一致(相同的高度和值类型)。
票数 3
EN

Stack Overflow用户

发布于 2013-10-22 19:51:09

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

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

BCEL

原始答案,在goto上的源代码:

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

goto关键字存在,但它没有实现。

通过詹姆斯·高斯林查看这个有趣的视频

票数 1
EN

Stack Overflow用户

发布于 2013-10-22 19:50:55

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19526967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档