为什么在编译接口后,“默认”方法修饰符从“javap -v”中消失了?

问题描述

我观察到,在编译包含 default 方法定义的接口后,例如:

interface Delta {

    default void someMethod() {
        System.out.println("Hi.");
    }

}

并在反汇编相应的 .class 文件后(此处仅包括相应的片段):

javap -v Delta.class

####

{
  public void someMethod();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=2,locals=1,args_size=1
         0: getstatic     #1                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #2                  // String Hi.
         5: invokevirtual #3                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 10: 0
        line 11: 8
}

default 修饰符不见了。

谁能解释一下 - 为什么?

我正在跑步:

openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9,mixed mode)

注意,我知道,当没有定义修饰符时,所有方法都是隐式 public。所以,我not asking 为什么 public 修饰符存在于文件的编译版本中。

解决方法

看起来肯定是一个 javap 错误,请参阅 this defect。我在添加新功能时遇到了更多这些 javap 问题,仅供参考。