【问题标题】:Why, after compiling an interface, "default" method modifier is gone from "javap -v"?为什么编译接口后,“javap -v”中的“default”方法修饰符消失了?
【发布时间】:2021-10-06 07:26:06
【问题描述】:

我观察到,编译一个包含default方法定义的接口后,像:

interface Delta {

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

}

在拆解各自的.class文件后(这里只包括对应的sn-p):

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 修饰符出现在文件的编译版本中。

【问题讨论】:

  • 显然是什么 java 版本。可能是javap 中的一个错误 - 因为我在 jdk-16 上并且我确实看到了。
  • @Eugene 好点。这是openjdk version "11.0.2" 2019-01-15
  • 问题是为什么javap 没有显示default 修饰符。修饰符本身是源代码,而不是字节码,因此它不会出现在编译的字节码中(并且该方法未标记为 abstract 的事实足以知道它具有默认实现)。跨度>
  • @kaya3 那么为什么所有其他修饰符都存在于反汇编的修饰符中?如果你能试着帮助我理解我的观点,我将不胜感激,而不是急于证明我的问题有多么错误

标签: java default-method javap


【解决方案1】:

看起来确实像 javap 错误,请参阅 this defect。在添加新功能时,我遇到了更多 javap 问题,仅供参考。

【讨论】:

  • 赞成;但是有一个问题:“受影响的版本:8、11.0.1、12”。他们可能在 11.0.2 中也有它。
  • 所以,他们只是包含了它被修复的地方.. 但不是所有存在的版本。 :)
猜你喜欢
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 2023-03-11
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
相关资源
最近更新 更多