有些JVM规范的部分暗示了操作JSR (跳转子例程), JSR_W (宽跳转子例程)和RET (从子例程返回)只能在50.0(JDK 1.6)之前的类文件版本中使用:
(本节假设编译器生成的类文件版本号为50.0或以下,因此可以使用jsr指令。参见§4.10.2.5。)
之后:
为了实现
try
-finally
结构,生成版本号为50.0或以下的Java编程语言的编译器可以使用异常处理设施以及两个特殊指令:jsr(“跳转到子程序”)和ret(“从子程序返回”)。
另一方面,操作码描述本身并没有关于这些功能被弃用的说明。引用的文本只是说明了在50.0版本之前的情况,但并没有明确说明之后的情况。
这条评论(针对一个问题,该问题询问此弃用或删除背后的动机)表明存在类似的困惑,因此显然我不是唯一寻找答案的人。
jsr
,使用新的基于堆栈帧的验证仍然无法处理它们,因为每个分支目标都需要一个显式的堆栈帧,但是堆栈帧无法表示帧中的返回地址类型。 - Holger