为什么在编译接口后,"default" 方法修饰符从 "javap -v" 中消失了?
Why, after compiling an interface, "default" method modifier is gone from "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
。所以,我是 为什么 public
修饰符存在于文件的编译版本中。
看起来确实像一个 javap
错误,参见 this defect。添加新功能时,我遇到了更多这些 javap
问题,仅供参考。
我观察到,在编译包含 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
。所以,我是 public
修饰符存在于文件的编译版本中。
看起来确实像一个 javap
错误,参见 this defect。添加新功能时,我遇到了更多这些 javap
问题,仅供参考。