![]() |
1
5
以以下示例为例:
从客户机代码的角度来看,默认方法只是普通的虚拟方法。因此命名为虚拟扩展方法。因此,在使用调用默认方法的客户端代码的示例中,将在调用站点生成invokeinterface。
在默认方法冲突解决的情况下,当我们重写默认方法并希望将调用委托给其中一个接口时,将推断invokespecial,因为我们将专门调用实现:
如您所见,invokespecial指令用于调用接口方法foo()。从字节码的角度来看,这也是一个新特性,因为之前您只能通过指向类(父类)而非接口的super调用方法。 |
![]() |
2
1
这取决于你实际上在做什么,你会遇到什么障碍。你说
但这与您尝试使用JVM 7读取Java 8字节码时发生的情况甚至根本不匹配。如果尝试用Java7 JVM加载Java8类,通常会得到
相反,当Eclipse编译器无法读取类文件的字节码时,错误消息看起来非常像众所周知的错误消息,而这与JVM无关。如中所述
this answer
,Eclipse似乎并没有在它没有找到的类和它未能解析的类之间做出区别,只是说
无法解决
。它似乎也忽略了类文件的版本号,所以当新的类文件没有使用新的功能时,它正好可以使用新的类文件,如
在技术层面上,差异很小。两者之间没有关系
如果JVM验证器没有在版本号处停止,它只会抛出一个不同的
|
![]() |
3
0
Anurag已经解释了一些默认方法的实现,但我想解决您问题中的另一点:
这是因为每个类文件都有一个版本代码,表示它编译的Java版本。JVM将拒绝任何版本代码高于自身的类文件(尽管为了向后兼容,版本代码越低越好)。 这意味着,即使字节码没有任何其他变化,JVM仍然会拒绝从未来版本的Java加载类文件。您可以用Java 10编译“hello world”,Java 9 JVM将拒绝加载它,即使没有新特性或字节码差异。 |
|
user29759326 · 如何返回递归函数中的最后一个值? 3 月前 |
|
malife89 · 将java中的字符串读取为正确的日期格式 3 月前 |
![]() |
Tim · 在java中,有没有更快的方法将字节数组写入文件? 3 月前 |
![]() |
rudraraj · java中未声明最终变量 3 月前 |
![]() |
Bala Ji · 以下BFS的实施效率如何? 3 月前 |