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

@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() def
ault 1;
}
常用保留策略有三个:
-
SOURCE:只保留在源代码中,编译后丢弃(如
@Override) - CLASS:保留在 .class 文件中,但运行时不可见(默认值)
- RUNTIME:保留在 .class 中且可通过反射读取(写框架、AOP、ORM 时必需)
搭配 @Target 明确使用位置(推荐一起用)
单独用 @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如何创建注解?的详细内容,更多请关注其它相关文章!
# 还得
# 柳州seo排名公司
# 青岛seo是什么
# 鹤壁seo网站优化费用情况
# 即墨网站优化推广
# 建设网站价格是多少
# 会泽媒体网站建设概况
# 青浦区网站优化方案定制
# 网站建设要会什么
# 皮具如何营销推广产品呢
# 企业认证后可营销推广吗
# java
# 自定义
# 中文网
# 相关文章
# 能在
# 要在
# 是一个
# 时长
# 转换为
# 好了
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
J*aScript DOM操作:高效清空列表元素的策略与实践
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
《马克思佩恩3》早期版本曝光 UI设计曾多次调整!
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
Django通过AJAX异步上传图片并保存至模型的完整指南
React项目中导航栏Logo自适应布局:避免裁剪与布局溢出
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
解决Tabulator日期时间排序问题的专业指南
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
126邮箱网页版官方入口 126邮箱账号在线登录平台
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
如何使用纯J*aScript判断Input元素是否在特定类容器内
提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案
AO3官方在线访问地址 Archive of Our Own最新镜像合集
css绝对定位元素脱离父容器怎么办_确保父元素position非static
J*aScript教程:根据元素文本内容动态设置背景色
高德地图怎么看全景照片_高德地图全景照片浏览教程
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
顺丰快件物流信息 官方网站查询入口
CSS子选择器:如何区分并样式化嵌套列表的子层级
批改网学生版PC登录 批改网官网登录系统入口
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
期待已久:小米17 Ultra、小米首款NAS本月登场
QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址
J*aScript动态修改指定div内所有a标签样式指南
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
快手极速版在线观看 官方网页版登录地址
J*aScript实现动态背景色下的文本与按钮颜色自适应调整
Golang如何实现简单的Web表单_Golang表单提交与验证处理方法
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
4399免费游戏网址入口 4399小游戏免费入口点开即玩
解决Python单元测试中Mock异常方法调用计数为零的问题
CSS Grid如何控制元素对齐_align-items与justify-items组合使用
铃兰之剑为这和平的世界希里技能组及加点推荐
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
Animex动漫社网入口地址 Animex动漫社网正版在线入口
msn官网入口地址手机版 msn官方网站手机最新链接
BetterDiscord插件中安全更新用户简介的实践指南
如何更改在 Excel 中打开超链接时的默认浏览器
中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】
windows10怎么查看本机ip_windows10命令提示符ipconfig使用
使用Python高效删除Word宏并转换DOCM为DOCX格式
NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰


2025-12-09
浏览次数:次
返回列表
ault 1;
}