通过javap反编译接口
在 Java 中,接口(interface)中的方法默认都是 public 和 abstract 的,即使在源代码中没有显式地指定这两个修饰符。当你编写:
public interface Person {
void eat();
void sleep();
}
实际上等价于:
public interface Person {
public abstract void eat();
public abstract void sleep();
}
这是因为根据 Java 语言规范,在接口中声明的方法如果没有指定访问修饰符,默认就是 public,而且接口方法默认是 abstract(抽象)的。
当你使用 javac 编译器编译源代码时,编译器会将这些隐式的修饰符(public 和 abstract)应用到方法上,并将其写入生成的字节码文件中。
随后,当你使用 javap 反编译字节码时,javap 会显示出方法的完整签名,包括所有的修饰符。因此,你会看到:
public interface Person {
public abstract void eat();
public abstract void sleep();
}
这就是为什么你在反编译后看到方法前面多了 public abstract 修饰符的原因。
总结:因为接口中的方法默认是 public 和 abstract,编译器在编译时会将这些修饰符应用到方法上,反编译时就会显示出来。
参考:
Answer: Because in Java, interface methods are implicitly public and abstract—even if not explicitly declared—so the compiler adds these modifiers, and javap displays them when decompiling.
浙公网安备 33010602011771号