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

[补充笔记] JavaReStudy#19 - Java 注解

注解

【已申请转载/引用授权】本文内容主要参考资料:[柏码,Java 注解] https://www.itbaima.cn/zh-CN/document/qrd0xfttsz32gpqg?segment=3#注解

​ 注解本质上也是一个类,只不过它的用法比较特殊

​ 注解可以被标注在任意地方,包括方法上、类名上、参数上、成员属性上、注解定义上等,就像注释一样,它相当于我们对某样东西的一个标记。而与注释不同的是,注解可以通过反射在运行时获取,注解也可以选择是否保留到运行时

预设注解

JDK预设了以下注解,作用于代码:

  • @Override - 检查(仅仅是检查,不保留到运行时)该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误
  • @Deprecated - 标记过时方法。如果使用该方法,会报编译警告
  • @SuppressWarnings - 指示编译器去忽略注解中声明的警告(仅仅编译器阶段,不保留到运行时)
  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口
  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告

元注解

元注解是作用于注解上的注解,用于我们编写自定义的注解:

  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问
  • @Documented - 标记这些注解是否包含在用户文档中
  • @Target - 标记这个注解应该是哪种 Java 成员
  • @Inherited - 标记这个注解是继承于哪个注解类(默认注解并没有继承于任何子类)
  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

​ 该注解由 @Target 限定为只能作用于方法上,ElementType是一个枚举类型,用于表示此枚举的作用域,一个注解可以有很多个作用域。@Retention 表示此注解的保存策略,这里定义为只在代码中。一般情况下,自定义的注解需要定义1个 @Retention和 1~n 个@Target

注解的使用

​ 注解的成员变量以“无形参的方法”形式来声明,其方法名定义了成员变量名,返回值定义了成员变量的类型

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {String value();
}

​ 当注解只有一个属性时,可以将该属性命名为value。此时,使用注解时可以直接传入属性值,而无需指定属性名(如@Test("magicshushu"))

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {String test();
}
public class Main {@Test(test = "")public static void main(String[] args) {}
}

​ 当属性不叫value,或注解有多个属性时,使用注解必须指明属性名(如@Test(test = ""))

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {String value() default "magicShushu";
}

​ 可以在定义属性时使用default关键字为其指定默认值(如String value() default "magicShushu";)。当属性有默认值时,使用该注解时可以不为该属性赋值

​ 当属性为数组,我们在使用注解传参时,如果数组里面只有一个内容,我们可以直接传入一个值,而不是创建一个数组:

@Test("value1")
public static void main(String[] args) {}
@Test({"value1", "value2"})   //多个值时就使用花括号括起来
public static void main(String[] args) {}

反射获取注解

获取类上的注解

public static void main(String[] args) {Class<Student> clazz = Student.class;for (Annotation annotation : clazz.getAnnotations()) {System.out.println(annotation.annotationType());   //获取类型System.out.println(annotation instanceof Test);   //直接判断是否为TestTest test = (Test) annotation;System.out.println(test.value());   //获取我们在注解中写入的内容}
}
  1. 首先通过 类名.class 获取该类的 Class 对象
  2. 调用 Class 对象的 getAnnotations() 方法,返回一个注解数组(Annotation[]),遍历它即可获得所有注解
  3. 在遍历中,可以通过 annotation.annotationType() 获取注解的具体类型
  4. 可以通过 instanceof 关键字直接判断注解是否为特定类型(如 Test )
  5. 将注解强制转换为具体类型后,即可调用其属性方法(如 test.value())来获取注解中定义的值

获取方法上的注解

public static void main(String[] args) throws NoSuchMethodException {Class<Student> clazz = Student.class;for (Annotation annotation : clazz.getMethod("test").getAnnotations()) {System.out.println(annotation.annotationType());   //获取类型System.out.println(annotation instanceof Test);   //直接判断是否为TestTest test = (Test) annotation;System.out.println(test.value());   //获取我们在注解中写入的内容}
}

​ 基本流程与获取类注解相同,区别在于需要先通过 Class 对象的 getMethod("方法名") 方法获取目标方法的 Method 对象。然后对 Method 对象调用 getAnnotations() 方法,后续步骤同上

​ 不仅限于类和方法,对于字段(Field)同样可以使用 getAnnotations() 方法来获取其标记的注解

http://www.jsqmd.com/news/492019/

相关文章:

  • Phi-3-vision-128k-instruct实际作品:真实用户上传商品图→多轮问答→生成详情页文案
  • windows基础学习
  • 自定义UDP协议视频传输环形缓冲区重构(真正的一次分配,循环使用)
  • 告别模拟器:让APK安装在Windows上变得像安装软件一样简单
  • 2026年必看!开源AI编程工具OpenCode全面解析
  • 2024 必看!分离焦虑与孩子刚上幼儿园哭闹的关联,至德幼儿园深度剖析
  • SpringBoot+Vue +校园求职招聘系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 17:无人机远程执行路径规划:A*算法与GPS精准打击
  • 私家车交通事故处理流程图 全责无责判定指引
  • 砸108亿美元造芯!莫迪的野心,真能实现吗?
  • 虚假新闻检测数据集中的隐藏偏见
  • 半封闭螺杆压缩机的CAD图纸
  • Calicat+Trae:从需求到原型代码的AI实践
  • 18:医疗IoT设备控制基础:MQTT协议漏洞与远程操作模型
  • 【案例】政务智能客服架构实践:AI应用架构师如何设计支持多语言的高并发系统
  • 中西医执业老师怎么选? - 医考机构品牌测评专家
  • 手把手拆解工业级ISP算法源码
  • 12仓位3x4立体仓库货仓组态王6.55模拟仿真程序99:带运行效果视频
  • MongoDB索引交集与覆盖查询:减少磁盘I/O的实用技巧
  • 基于腾讯云创建 Minecraft Forge 服务器
  • 不止于“拍照”:凝胶成像分析系统的核心性能指标与选购指南 - 品牌推荐大师
  • AI教材生成工具推荐,低查重率为教材质量保驾护航!
  • 我的执医备考之路:为什么我选择了阿虎医考 - 医考机构品牌测评专家
  • 19:《死亡笔记》自动驾驶车辆“意外“机制:CAN总线逆向与控制劫持原理
  • LINUX 防火墙管理
  • 寒门博士的十字路口:高校、公务员还是企业?
  • 2026年第11周社区趋势周报:OpenClaw引爆AI智能体热潮,生态博弈与硬件新风口并行
  • 平衡车:核心算法与工程实现
  • 磁力耦合:用代码探索磁场的变形魔法
  • 深度拆解OpenClaw:引爆“赛博养虾”狂潮的技术内核、产业重构与暗面危机