Java中的注释是否会被编译到字节码中,核心取决于注释的保留策略,不同的保留策略决定了注释在程序运行过程中的生命周期和存储位置。Java的注释机制从诞生之初就设计了灵活的保留规则,适配不同的使用场景,并非所有注释都会进入最终的字节码文件。

Java注释的三种保留策略
Java通过@Retention元注释来指定自定义注释的保留策略,保留策略由RetentionPolicy枚举定义,共有三种取值,分别对应不同的生命周期:
- SOURCE:注释仅保留在源码阶段,编译器在编译时会直接丢弃这类注释,不会将其写入字节码文件,也不会在运行时存在。
- CLASS:注释会保留到字节码阶段,编译器会将这类注释写入生成的.class字节码文件中,但JVM加载类时不会将其保留到运行时,这是默认的保留策略(如果不指定
@Retention,默认使用此策略)。 - RUNTIME:注释会保留到运行时阶段,编译器会将其写入字节码文件,JVM加载类后也会保留该注释信息,因此可以通过反射在运行时获取注释内容。
不同保留策略的注释验证
我们可以通过自定义三种不同保留策略的注释,编译后查看字节码来验证注释的存储情况。
自定义三种保留策略的注释
首先定义三个不同保留策略的注释:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
// 源码级保留注释
@Retention(RetentionPolicy.SOURCE)
@interface SourceAnnotation {
String value() default "";
}
// 字节码级保留注释(默认策略)
@Retention(RetentionPolicy.CLASS)
@interface ClassAnnotation {
String value() default "";
}
// 运行时保留注释
@Retention(RetentionPolicy.RUNTIME)
@interface RuntimeAnnotation {
String value() default "";
}
使用注释并编译查看字节码
编写一个测试类使用这三个注释:
public class AnnotationTest {
@SourceAnnotation("源码注释")
@ClassAnnotation("字节码注释")
@RuntimeAnnotation("运行时注释")
public void testMethod() {
}
}
编译该类后,使用javap -v AnnotationTest.class命令查看字节码内容,会发现字节码中仅存在ClassAnnotation和RuntimeAnnotation的信息,SourceAnnotation已经被编译器完全丢弃,不会出现在字节码中。
运行时注释的提取方式
只有保留策略为RUNTIME的注释才能在运行时被提取,Java的反射API提供了对应的方法来获取类、方法、字段上的注释信息。
以下是提取运行时注释的示例代码:
import java.lang.reflect.Method;
public class AnnotationExtractTest {
@RuntimeAnnotation("测试方法")
public void demo() {
}
public static void main(String[] args) throws Exception {
// 获取类的Class对象
Class<?> clazz = AnnotationExtractTest.class;
// 获取指定方法
Method method = clazz.getMethod("demo");
// 判断方法是否存在RuntimeAnnotation注释
if (method.isAnnotationPresent(RuntimeAnnotation.class)) {
// 获取注释实例
RuntimeAnnotation annotation = method.getAnnotation(RuntimeAnnotation.class);
// 输出注释的属性值
System.out.println("注释值:" + annotation.value());
}
}
}
运行上述代码会输出注释值:测试方法,说明成功提取到了运行时的注释信息。
文档注释的提取方式
Java的文档注释/** ... */本身不属于注解体系,默认也不会被编译到字节码中,它的主要作用是生成API文档。我们可以通过javadoc命令提取文档注释生成HTML格式的API文档:
# 提取当前目录下所有java文件的文档注释,生成文档到doc目录 javadoc -d doc *.java
如果需要将文档注释的信息保留到运行时,需要结合自定义运行时注解,将文档说明的内容作为注解的属性值,再通过反射提取。
总结
Java里的注释能否被编译到字节码中完全由保留策略决定:SOURCE策略的注释不会被编译到字节码,CLASS和RUNTIME策略的注释会被写入字节码,但只有RUNTIME策略的注释能在运行时通过反射提取。文档注释默认不参与字节码编译,仅用于生成API文档,若需要运行时使用文档内容,可结合运行时注解实现。
Java注释保留策略字节码文档提取RetentionPolicy修改时间:2026-06-29 22:48:27