反汇编一些Java 8代码我发现invokestatic接口中的一些静态方法调用(特别是这个java.util.function.Function.identity())在const pool中使用了InterfaceMethodRef; 这是javap -s -c -v p告诉我的:
15: invokestatic #66 // InterfaceMethod java/util/function/Function.identity:()Ljava/util/function/Function;
Run Code Online (Sandbox Code Playgroud)
根据JVM 8规范,这是不可能的,当我在带有Java 7(major version=51)版本的classfile中使用此指令时,它已在此指令上抛出VerifyError.
但是,当我将主要版本更改为时52,它开始像魅力一样工作.请注意,我在Oracle JDK 1.8.0_60上运行.我想知道为什么需要进行这种更改(调用的方法是静态链接的,不是吗?)以及是否记录在任何地方.