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

@Retention 是 J*a 中用来指定注解保留策略的元注解,它**不负责创建注解本身**,而是控制你自定义的注解在什么阶段还“有效”——比如编译期、运行时,还是仅在源码中存在。
J*a 注解本质是一个特殊的接口,用 @interface 声明:
public @interface MyLog {
String value() default "log";
int level() default 1;
}
这样就定义了一个带两个属性的注解 @MyLog。但此时它默认只保留在源码阶段(RetentionPolicy.SOURCE),运行时 getAnnotation() 拿不到。
要在运行时通过反射获取该注解,必须显式加上 @Retention(RetentionPolicy.RUNTIME):
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {
String value() default "log";
int level() def
ault 1;
}
常用保留策略有三个:
@Override)单独用 @Retention 不够,你还得告诉编译器这个注解能加在哪儿,比如类、方法、参数等:
GemDesign
AI高保真原型设计工具
652
查看详情
@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开启或关闭快速启动教程【技巧】