通过javap反编译接口

在 Java 中,接口(interface)中的方法默认都是 publicabstract 的,即使在源代码中没有显式地指定这两个修饰符。当你编写:

public interface Person {
    void eat();
    void sleep();
}

实际上等价于:

public interface Person {
    public abstract void eat();
    public abstract void sleep();
}

这是因为根据 Java 语言规范,在接口中声明的方法如果没有指定访问修饰符,默认就是 public,而且接口方法默认是 abstract(抽象)的。

当你使用 javac 编译器编译源代码时,编译器会将这些隐式的修饰符(publicabstract)应用到方法上,并将其写入生成的字节码文件中。

随后,当你使用 javap 反编译字节码时,javap 会显示出方法的完整签名,包括所有的修饰符。因此,你会看到:

public interface Person {
  public abstract void eat();
  public abstract void sleep();
}

这就是为什么你在反编译后看到方法前面多了 public abstract 修饰符的原因。

总结:因为接口中的方法默认是 publicabstract,编译器在编译时会将这些修饰符应用到方法上,反编译时就会显示出来。

参考

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.

posted @ 2024-11-27 23:03  xkfx  阅读(28)  评论(0编辑  收藏  举报