导读:本期聚焦于小伙伴创作的《Java里的注释能否被编译到字节码中?保留策略与文档提取怎么实现》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java里的注释能否被编译到字节码中?保留策略与文档提取怎么实现》有用,将其分享出去将是对创作者最好的鼓励。

Java中的注释是否会被编译到字节码中,核心取决于注释的保留策略,不同的保留策略决定了注释在程序运行过程中的生命周期和存储位置。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命令查看字节码内容,会发现字节码中仅存在ClassAnnotationRuntimeAnnotation的信息,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策略的注释不会被编译到字节码,CLASSRUNTIME策略的注释会被写入字节码,但只有RUNTIME策略的注释能在运行时通过反射提取。文档注释默认不参与字节码编译,仅用于生成API文档,若需要运行时使用文档内容,可结合运行时注解实现。

Java注释保留策略字节码文档提取RetentionPolicy修改时间:2026-06-29 22:48:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。