信息发布→ 登录 注册 退出

J*a基础@Retention如何创建注解?

发布时间:2025-12-09

点击量:
@Retention是J*a中指定注解保留策略的元注解,不创建注解而控制其生命周期:SOURCE(仅源码)、CLASS(默认,.class中但运行时不可见)、RUNTIME(.class中且反射可读)。

java基础@retention如何创建注解?

@Retention 是 J*a 中用来指定注解保留策略的元注解,它**不负责创建注解本身**,而是控制你自定义的注解在什么阶段还“有效”——比如编译期、运行时,还是仅在源码中存在。

先创建一个注解(用 interface + @interface)

J*a 注解本质是一个特殊的接口,用 @interface 声明:

public @interface MyLog {
    String value() default "log";
    int level() default 1;
}

这样就定义了一个带两个属性的注解 @MyLog。但此时它默认只保留在源码阶段(RetentionPolicy.SOURCE),运行时 getAnnotation() 拿不到。

用 @Retention 指定注解生命周期

要在运行时通过反射获取该注解,必须显式加上 @Retention(RetentionPolicy.RUNTIME)

@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
    String value() default "log";
    int level() default 1;
}

常用保留策略有三个:

  • SOURCE:只保留在源代码中,编译后丢弃(如 @Override
  • CLASS:保留在 .class 文件中,但运行时不可见(默认值)
  • RUNTIME:保留在 .class 中且可通过反射读取(写框架、AOP、ORM 时必需)

搭配 @Target 明确使用位置(推荐一起用)

单独用 @Retention 不够,你还得告诉编译器这个注解能加在哪儿,比如类、方法、参数等:

GemDesign GemDesign

AI高保真原型设计工具

GemDesign 652 查看详情 GemDesign
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyLog { ... }

常见 ElementType 值:

  • TYPE → 类、接口、枚举
  • METHOD → 方法
  • FIELD → 成员变量
  • PARAMETER → 方法参数
  • LOCAL_VARIABLE → 局部变量(很少用)

验证注解是否生效(运行时反射)

加了 @Retention(RUNTIME) 后,就能在运行时读取:

@MyLog(level = 2)
public class UserService {
    @MyLog("update user")
    public void update() { ... }
}

// 反射获取
MyLog anno = UserService.class.getAnnotation(MyLog.class);
System.out.println(anno.level()); // 输出 2

如果没加 @Retention(RUNTIME),这里会返回 null

基本上就这些。@Retention 不是“创建”注解的步骤,而是让注解“活到你需要的时候”的关键配置。

以上就是J*a基础@Retention如何创建注解?的详细内容,更多请关注其它相关文章!


相关文章: CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  J*aScript DOM操作:高效清空列表元素的策略与实践  自定义 WooCommerce 购物车:始终显示全部交叉销售商品  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  精准捕获:如何在页面中监听除特定元素外的所有点击事件  抖音网页版平台入口 抖音网页版官网在线访问教程  Lar*el 中按“Has One Of Many”关联模型排序的最佳实践  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  在Typer应用中优雅地处理和重组任意命令行参数  mc.js游戏直达 mc.js网页免下载版本秒进地址  C++ vector二维数组定义_C++ vector of vector用法  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  《噬血代码2》新预告片发布 展示游戏剧情  C#中解析不规范的HTML为XML 常见的坑与解决办法  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤  快手极速版在线观看 官方网页版登录地址  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  利用Bokeh CustomJS动态控制DataTable列可见性  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  解决Django多数据库/多Schema环境下外键迁移问题  58动漫网在线官方网 58动漫网正版动漫入口网址  Discord Slash 命令响应超时问题的异步解决方案  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  J*aScript动态修改指定div内所有a标签样式指南  高德地图怎么看全景照片_高德地图全景照片浏览教程  内存检查:在VS Code中调试C++时的内存视图  汽水音乐在线版入口_汽水音乐网页播放手册  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  在WordPress中通过REST API获取BasicAuth保护的远程文章  实现分段式页面滚动导航:CSS与J*aScript教程  12306选座怎么选到商务座_12306商务座选择与配置说明  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  解决深度学习模型训练初期异常高损失与完美验证准确率问题  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!