新闻中心

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如何创建注解?的详细内容,更多请关注其它相关文章!


# 还得  # 柳州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万亿美元巅峰 

搜索