1.概述

是什么:是对方法、类、参数、包、域以及变量等进行代码功能的增强或者修改程序的行为等操作。

应用

  • 跟踪代码依赖性,实现替代配置文件功能
  • 在反射中使用Annotation,字段格式化(如:数据字段脱敏、日期格式)
  • 在编译时进行格式检查
  • 生成帮助文档

2.注解相关知识

元注解指的是所有注解都基于它们而产生的最基础的注解。

2.1.Annotation接口和元注解

这张图包含了Annotation接口信息、4个元注解作用和元注解的参数信息

整体关系(具体信息都在图中)

  • 顶级注解接口:Annotation

  • 元注解

    • @Documented
    • @Inherited
    • @Target
    • @Retention
  • native级别的关键字

    • @interface 指明是注解类

关联关系

  • 1个Annotation 和 1个RetentionPolicy关联。

    • 可以理解为:每1个Annotation对象,都会有唯一的RetentionPolicy属性。
  • 1个Annotation 和 1~n个ElementType关联。

    • 可以理解为:对于每1个Annotation对象,可以有若干个ElementType属性。

2.2.注解元素支持的数据类型

  • 所有基本类型
  • String
  • Class
  • enum
  • annotation
  • 以上类型的数组

2.3.常见基础注解的作用

@SuppressWarnings:抑制编译器警告的注解,编译检查注解

@Deprecated:弃用注解,编译检查注解

@Override:限定重写父类方法的注解,具有编译检查作用

@FunctionalInterface:函数式接口注解,限制接口只能有一个抽象方法

3.自定义注解

返回值类型等于参数的类型,

方法的名称等于参数的名称(使用注解是参数名称),

可以通过default关键字来声明参数的默认值。

通过一个案例来理解注解的使用(不懂反射的可以看我的另一篇文章)

3.1.案例:通过反射处理自定义注解

自定义注解类:颜色注解类 + 颜色枚举

@Target( ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ColorBanana {/*** 颜色枚举类*/public enum Color{YELLOW,BLACK,WHITE,RED}// 颜色属性Color colorBanana() default Color.YELLOW;}

实体类:使用注解的类

public class Banana {private String bananaName;@ColorBanana(colorBanana = ColorBanana.Color.RED)private String bananaColor;public String getBananaName() {return bananaName;}public void setBananaName(String bananaName) {this.bananaName = bananaName;}public String getBananaColor() {return bananaColor;}public void setBananaColor(String bananaColor) {this.bananaColor = bananaColor;}@Overridepublic String toString() {return "Banana{" + "bananaName=" + bananaName + ", bananaColor=" + bananaColor + "}";}
}

测试类:反射处理注解

public class BananaTest {// 创建注解赋值后的Banana实例对象public static Banana newBanana() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {Class<Banana> bananaClass = Banana.class;Banana banana = bananaClass.getConstructor().newInstance();/*** 获取Banana类中 ColorBanana注解信息*   因为注解信息打在成员变量上,所以要通过Filed来get注解*   (注解打在什么上,就用什么来获取注解)*/Field[] fields = bananaClass.getDeclaredFields();//注解打在私有成员变量,所以要用getDeclaredFieldsfor (Field field : fields){field.setAccessible(true);//忽略私有修饰符得限制,否则报语法错误// 拿到注解ColorBanana annotation = field.getAnnotation(ColorBanana.class);// 有些字段没有ColorBanana注解,记得判空if (annotation != null){ColorBanana.Color color = annotation.colorBanana();System.out.println("输出注解中得信息:"+field.getName()+"="+color);/** 将注解中得信息赋值到对象对应字段中*   因为实体类Banana 的bananaColor字段是字符串,所以要拿枚举类属性得name(名称)进行赋值*/field.set(banana,color.name());}}// 输出反射得到得对象信息System.out.println(banana);return banana;}public static void main(String[] args) throws Exception {Banana banana = newBanana();banana.setBananaName("myBananaName");System.out.println(banana);}
}

执行结果:

输出注解中得信息:bananaColor=RED

Banana{bananaName=null, bananaColor=RED}

Banana{bananaName=myBananaName, bananaColor=RED}

注解值成功传入到实例化对象中的对应字段,并返回实例化对象给调用者。

Java往期文章

Java全栈学习路线、学习资源和面试题一条龙

我心里优秀架构师是怎样的?

免费下载经典编程书籍

原创不易,三联支持:点赞、在看、分享

Java注解--一张图一案例掌握自定义注解相关推荐

  1. java注解约束参数为固定值_java自定义注解的实现及属性设置

    java自定义注解,元注解的使用 ,元注解中值详解 元注解:用于注解注解的注解... 元注解共有4个: ①.@Target:用于明确注解用于目标类的哪个位置 ElementType枚举类的值: Typ ...

  2. 学python还是java贴吧_是学python还是java?一张图告诉你!

    物联网硬件开发 - 零基础学习电子产品设计 - 创客学院直播室​www.makeru.com.cn Java 和 Python 一直都是两种很火很强大的编程语言,对于刚开始起步学习编程的同学来说,会迷 ...

  3. 深入理解Java:注解(Annotation)基本概念、自定义注解、注解解析器

    深入理解Java:注解(Annotation)基本概念 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadat ...

  4. java注解如何设置自增长_java如何自定义注解(一)

    JDK内置的一些常用的注解: * @Override :检测被该注解标注的方法是否是继承自父类(接口)的 * @Deprecated:该注解标注的内容,表示已过时 * @SuppressWarning ...

  5. 简述java在安卓开发中的应用_Java 自定义注解在安卓开发中的简单运用

    定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.接口.枚举.字段.方法.局部变量.方法 ...

  6. JAVA基础 | 一张图读懂非公平锁与公平锁

    在Java并发编程中,公平锁与非公平锁是很常见的概念,ReentrantLock.ReadWriteLock默认都是非公平模式,非公平锁的效率为何高于公平锁呢?究竟公平与非公平有何区别呢? 首先先简单 ...

  7. java 双向链表_23张图!万字详解「链表」,从小白到大佬

    链表和数组是数据类型中两个重要又常用地基础数据类型,数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解决 ...

  8. python比java好学吗-到底学Python还是Java?一张图PK明白!

    魔爪营科技教育 编程启蒙/科学思维 |Scratch|Arduino|JAVA|科学探索| Java 和 Python 一直都是两种很火很强大的编程语言,对于刚开始起步学习编程的同学来说,会迷惑且最经 ...

  9. java 自定义注解_Java注解

    前言 近日在阅读开源项目,发现项目里好多奇奇怪怪的注解(@DataScope.@Log...)看得我一脸懵,不知道大家是否也有过这样的经历,回想了一下,发现自己对于注解的知识,好像只停留在@Overr ...

最新文章

  1. C# 8的新提案:new关键字类型推断
  2. 学习:二维码、QR码、J4L-QRCode、java
  3. 【目标检测】Fast RCNN算法详解
  4. 小区物业费信息管理系统设计c++_律师,我没有签物业合同,可以不交物业费吗?...
  5. c语言编程 输入螺旋数组,C语言 经典题目螺旋矩阵 实例详解
  6. linux基础命令学习(四)用户与群组
  7. 一文读懂云原生一体化数仓
  8. Java笔记-基于Spring Boot的SOAP双向SSL认证及WS-Security
  9. javascript中索引_如何在JavaScript中找到数字在数组中所属的索引
  10. java零碎要点013---JAVA执行js_java执行JavaScript_java执行js引擎不能识别document浏览器内置对象解决办法
  11. Cesium 学习笔记
  12. 什么是悬空 Docker 镜像?
  13. 为什么python文件用cmd老是出现语法错误_关于Python的py文件在Python自带的shell编辑器中运行成功,用cmd打开运行却出错 在cmd下运行结果...
  14. 微信小程序+SpringBoot实现校园快递代收平台
  15. 三菱PLC模板程序FX5U轴FB块 使用ST语言编写的轴FB块,包含原点复归,点动,定位运动
  16. 一分钟了解矩阵、方阵、对角矩阵、单位矩阵之间的关系
  17. 猜数字小游戏(Python)
  18. mysql数据库是的缩写_MYSQL数据库命名与其设计规范
  19. Web端H.265播放器研发解密 1
  20. java观看视频次数_java数字转换视频播放次数等

热门文章

  1. NetGear 路由器任意执行漏洞
  2. 高教版《管理学》(第四版)重点知识整理
  3. 73. 如何手动通过增强的方式,给 SAP ABAP 数据库表增添新的字段
  4. 基于XCP(On CAN)协议的Bootloader升级方案
  5. 爬虫(6)—— 淘宝商品比价定向爬虫
  6. 微信小程序css鼠标上去变色,微信小程序实现默认第一个选中变色效果
  7. Matlab中title函数使用
  8. Windows下jupyter notebook 修改主题、字体、字号等以及各个主题的样式的展示、插件的安装等
  9. 互联网,传递人性正能量
  10. mount函数C语言代码,C++ mount函数