首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字节码功能在Java语言中不可用

字节码功能在Java语言中不可用
EN

Stack Overflow用户
提问于 2011-07-26 16:39:36
回答 8查看 57.5K关注 0票数 150

目前(Java 6)有没有在Java字节码中可以做的事情,在Java语言中不能做的事情?

我知道两者都是图灵完成的,所以请阅读“可以做到”,因为“可以做得更快/更好,或者只是以一种不同的方式”。

我在考虑像invokedynamic这样的额外字节码,这些字节码不能用Java语言生成,除非特定的字节码是为将来的版本生成的。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-07-26 16:55:59

据我所知,Java6支持的字节码中没有不能从Java源代码访问的主要特性。其主要原因显然是Java字节码在设计时考虑到了Java语言。

但是,有一些特性不是由现代Java编译器产生的:

  • The ACC_SUPER flag

这是一个可以在类上设置的标志,用于指定如何为该类处理invokespecial字节码的特定边角大小写。它是由所有现代的Java编译器设置的(如果我没记错的话,“现代”是>= Java1.1),只有古老的Java编译器才会在没有设置它的地方生成类文件。此标志的存在仅出于向后兼容性的原因。请注意,从Java7u51开始,由于安全原因,完全忽略了ACC_SUPER。

  • jsr/ret字节码。

这些字节码用于实现子例程(主要用于实现finally块)。他们是no longer produced since Java 6。它们被弃用的原因是,它们使静态验证变得非常复杂,而没有太大的收益(即,使用的代码几乎总是可以用正常的跳转重新实现,而开销很小)。

  • 在一个类中有两个方法,只是返回类型不同。

Java语言规范不允许在同一个类中有两个方法,因为它们只是返回类型不同(例如,相同的名称、相同的参数列表等)。然而,JVM规范没有这样的限制,所以一个类文件可以包含两个这样的方法,没有办法使用普通的Java编译器生成这样的类文件。在this answer.中有一个很好的例子/解释

票数 62
EN

Stack Overflow用户

发布于 2011-07-26 17:55:49

以下是一些可以在Java字节码中完成但不能在Java源代码中完成的功能:

  • Throwing检查和未检查的异常只由编译器检查,而不是由JVM检查。例如,正因为如此,Scala可以在不声明方法的情况下抛出检查过的异常。尽管使用Java泛型有一种变通方法,称为sneaky throw.
  • Having一个类中只在返回类型上不同的两个方法,已经在Joachim's answer中提到:Java语言规范不允许在同一个类中只有返回类型不同的两个方法(即相同的名称,相同的参数列表,...)。然而,JVM规范没有这样的限制,所以一个类文件可以包含两个这样的方法,没有办法使用普通的Java编译器生成这样的类文件。在this answer.

中有一个很好的例子/解释

票数 14
EN

Stack Overflow用户

发布于 2013-02-15 00:50:38

  • GOTO可以与标签一起使用来创建您自己的控制结构(而不是forwhile等),
  • 您可以覆盖method
  • Combining中的
  • 局部变量,这两个都可以创建create tail call optimised (我在method
  • Combining中就是这样做的

作为一个相关点,如果使用debug (Paranamer does this by reading the bytecode )进行编译,您可以获得方法的参数名称

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

https://stackoverflow.com/questions/6827363

复制
相关文章

相似问题

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