当前位置: 首页 > news >正文

Java-元注解 (Meta-Annotations)

1.@Target(ElementType.METHOD)

作用:规定注解的使用位置。

  • 含义:这行代码限制了你的自定义注解只能标记在方法(Method)上

  • 效果:如果你尝试把这个注解加在类(Class)、字段(Field)或者包(Package)上,编译器会直接报错。

常见的 ElementType 类型:

  • METHOD:只能用于方法。

  • TYPE:用于类、接口、枚举。

  • FIELD:用于成员变量。

  • PARAMETER:用于方法参数。

举例:就像是给一张贴纸印上了“仅限贴在门把手上”,如果你贴在窗户上就是违规的。


2.@Retention(RetentionPolicy.RUNTIME)

作用:规定注解的生命周期(存活时间)。

  • 含义:这行代码表示你的注解会一直保留到程序运行期间 (Runtime)

  • 核心用途:这是最关键的一点。只有设置为RUNTIME,程序才能在运行时通过反射 (Reflection)机制读取到这个注解。如果不加这一行(或者设为其他值),你的代码跑起来的时候,这个注解就已经“消失”了,程序无法检测到它。

RetentionPolicy 的三个阶段对比:

策略 (Policy)存活范围说明典型应用
SOURCE源码阶段编译成.class文件后就被丢弃了。@Override,@SuppressWarnings
CLASS(默认)字节码阶段存在于.class文件中,但 JVM 加载运行时会忽略它。反射拿不到。Lombok, 编译时处理工具
RUNTIME运行阶段一直存在于 JVM 中,可以通过反射动态获取。Spring AOP, 自定义拦截器

举例:就像你写了一张便利贴:

  • SOURCE:看完就扔进垃圾桶。

  • CLASS:夹在书里存进了档案室,但平时工作时不拿出来看。

  • RUNTIME:贴在电脑屏幕边框上,随时干活随时看(程序运行时随时读取)。


3. 实际应用场景:AOP 与 拦截器

当你把这两个注解结合在一起时,通常是为了实现AOP(面向切面编程)拦截器功能。

代码示例:一个用于记录日志的自定义注解

import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 1. 定义注解:只能用在方法上,且运行时可通过反射读取 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyLog { String value() default ""; }

如何使用:

public class UserService { // 2. 正确使用:标记在方法上 @MyLog("记录用户登录操作") public void login() { System.out.println("用户正在登录..."); } // 错误使用:如果把 @MyLog 加在字段上,编译器会报错,因为 @Target 限制了只能是 METHOD // @MyLog // private String name; }

程序运行时(Spring AOP 或 反射)的逻辑:

  1. 程序运行到login()方法。

  2. 通过反射检查login()方法头上有没有@MyLog注解。

  3. 因为是RUNTIME,所以能扫描到。

  4. 读取注解里的内容("记录用户登录操作"),然后自动执行写日志的代码。


4.总结

  • @Target(ElementType.METHOD):划定界限,告诉编译器这个标签只能贴在方法上

  • @Retention(RetentionPolicy.RUNTIME):延长寿命,告诉 JVM程序运行时不要丢掉这个标签,因为我们的逻辑代码(如拦截器)需要读取它。

http://www.cnnetsun.cn/news/1490.html

相关文章:

  • @Component
  • 力扣-94.二叉树的中序遍历(Java递归)
  • 综合素质面试hr面
  • 降重与AIGC优化的认知任务解耦:八类工具在四项核心活动中的生态位映射与协同路径
  • PaperXie 降重复率/AI率功能如何化解学术写作中的“生成式焦虑”:一种面向“学术表达真实性”的智能协作框架——一位研究生的真实实践记录
  • 科研文稿 “学术查重的降噪滤波器”:PaperXie 降重降 AI 率如何让重复文本从 “信号杂音” 变 “导师认可的纯净成果”
  • 八款 AI 文本优化工具能力棱镜:基于“语义保真—AI消除—学科适配—流程嵌入”四维模型的八工具全景评估
  • 论文查重 / AI 检测总超标?PaperXie 用 “学术表达重塑法” 帮你把重复率 / AI 率压到安全线内
  • 构建你的“学术表达合规生态”:八款降重/AIGC工具如何在不同场景中协同降低检测风险?
  • PaperXie 数据分析功能如何重塑科研决策支持:一种面向“从数据到洞见”闭环构建的智能协作框架——一位研究生的真实实践记录
  • 论文数据分析总卡壳?PaperXie 用 “数据逻辑锚定法” 帮你从 “乱数堆” 里挖出研究结论
  • 50天50个小项目 (React19 + Tailwindcss V4) ✨| FAQ Collapse(问题解答折叠面板)
  • 《Mysql数据库应用》 第2版 郭文明 实验2 数据查询操作 答案
  • 同样是单片机工程师,高段位的已经在“定义智能”,新手还在跟LED死磕?
  • STM32居然能和服务器“聊天”?MQTT通信实现指南,小白也能看懂!
  • PPT文件的两种不可编辑情况
  • Excel文件中的保护工作表与工作簿的区别与应用
  • python猫眼电影数据可视化与智能分析平台 数据大屏 电影票房预测 电影推荐(协同过滤推荐算法)爬虫flask框架
  • 基于知识图谱电影推荐问答系统 neo4j图形数据库 问答系统 推荐系统 协同过滤推荐算法(建议收藏)✅
  • 基于python商品购物商城系统 购物系统 Django框架 购物平台 网购平台 大数据(建议收藏)✅
  • 基于python二手商品交易系统 二手网站 跳蚤网站 二手商品交易 大数据毕业设计(附源码)
  • YOLOv8测速测距车辆计数系统 ByteTrack算法 深度学习 目标计数 目标测速 目标检测
  • 深度学习车流量监测统计系统 YOLOv8模型 自定义检测区域 智慧交通大数据 多目标跟踪算法 COCO2017数据集
  • 深度学习YoloV8模型垃圾分类系统 深度学习pytorch 大数据 毕业设计(数据集+源码+文档)
  • 垃圾分类识别系统 pytorch框架 深度学习多模型LeNet、AlexNet、VGG、GoogLeNet、ResNet、MobileNet、MobileNet、RegNet模型 毕业设计
  • 全栈项目:python豆瓣电影推荐系统 Python+MySQL 可视化分析+个性化推荐 协同过滤推荐算法 毕业设计源码✅
  • Python+Django+协同过滤 电影推荐系统 数据分析 协同过滤算法(词云分析 源码+文档)大数据 毕业设计
  • 799-LangChain框架Evaluations使用培训总体介绍
  • 811-LangChain框架Use-Cases - SQL案例分析报告
  • 812-LangChain框架Use-Cases - SpeechToSQL案例分析报告