acc_interface标志(0x0200)是jvm识别接口的强制性身份证,必须存在于接口字节码access_flags中,否则加载时抛classformaterror;它决定jvm跳过构造器检查、要求super_class指向object、禁止普通方法含code属性。

Java中接口在字节码层面通过 ACC_INTERFACE 标志(值为 0x0200)明确标识其类型身份。
这个标志不是可选修饰,而是JVM规范强制要求的硬性标记:只要一个 .class 文件代表接口,它的 access_flags 字段必须包含 ACC_INTERFACE。JVM在类加载的验证阶段就依赖它来区分接口与普通类或抽象类。
-
ACC_INTERFACE被设置后,JVM会跳过对构造器、实例字段初始化等类专属逻辑的检查 -
this_class指向的常量池项必须是该接口的全限定名 -
super_class不能为0,必须指向java.lang.Object(体现接口默认继承Object) - 接口方法表中不允许出现
Code属性(除非是 default 或 static 方法),否则校验失败
你可用 javap -v 查看真实接口字节码,例如:
javap -v Runnable.class
输出中会显示:
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
对应十六进制值为 0x0601(0x0001 | 0x0200 | 0x0400),即 public + interface + abstract 三者共存。
如果手动清除 .class 文件中的 ACC_INTERFACE 位,JVM加载时会直接抛出 ClassFormatError,因为无法识别其为合法接口类型。
所以,ACC_INTERFACE 是字节码里接口的“身份证”,没有它,哪怕源码写的是 interface,编译器也不会生成合规的接口文件,运行时也根本不会被当作接口处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











