目前(Java 6)有没有在Java字节码中可以做的事情,在Java语言中不能做的事情?
我知道两者都是图灵完成的,所以请阅读“可以做到”,因为“可以做得更快/更好,或者只是以一种不同的方式”。
我在考虑像invokedynamic这样的额外字节码,这些字节码不能用Java语言生成,除非特定的字节码是为将来的版本生成的。
发布于 2011-07-26 16:55:59
据我所知,Java6支持的字节码中没有不能从Java源代码访问的主要特性。其主要原因显然是Java字节码在设计时考虑到了Java语言。
但是,有一些特性不是由现代Java编译器产生的:
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.中有一个很好的例子/解释
发布于 2011-07-26 17:55:49
以下是一些可以在Java字节码中完成但不能在Java源代码中完成的功能:
中有一个很好的例子/解释
发布于 2013-02-15 00:50:38
GOTO可以与标签一起使用来创建您自己的控制结构(而不是for、while等),作为一个相关点,如果使用debug (Paranamer does this by reading the bytecode )进行编译,您可以获得方法的参数名称
https://stackoverflow.com/questions/6827363
复制相似问题