Java注解--一张图一案例掌握自定义注解
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注解--一张图一案例掌握自定义注解相关推荐
- java注解约束参数为固定值_java自定义注解的实现及属性设置
java自定义注解,元注解的使用 ,元注解中值详解 元注解:用于注解注解的注解... 元注解共有4个: ①.@Target:用于明确注解用于目标类的哪个位置 ElementType枚举类的值: Typ ...
- 学python还是java贴吧_是学python还是java?一张图告诉你!
物联网硬件开发 - 零基础学习电子产品设计 - 创客学院直播室www.makeru.com.cn Java 和 Python 一直都是两种很火很强大的编程语言,对于刚开始起步学习编程的同学来说,会迷 ...
- 深入理解Java:注解(Annotation)基本概念、自定义注解、注解解析器
深入理解Java:注解(Annotation)基本概念 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadat ...
- java注解如何设置自增长_java如何自定义注解(一)
JDK内置的一些常用的注解: * @Override :检测被该注解标注的方法是否是继承自父类(接口)的 * @Deprecated:该注解标注的内容,表示已过时 * @SuppressWarning ...
- 简述java在安卓开发中的应用_Java 自定义注解在安卓开发中的简单运用
定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.接口.枚举.字段.方法.局部变量.方法 ...
- JAVA基础 | 一张图读懂非公平锁与公平锁
在Java并发编程中,公平锁与非公平锁是很常见的概念,ReentrantLock.ReadWriteLock默认都是非公平模式,非公平锁的效率为何高于公平锁呢?究竟公平与非公平有何区别呢? 首先先简单 ...
- java 双向链表_23张图!万字详解「链表」,从小白到大佬
链表和数组是数据类型中两个重要又常用地基础数据类型,数组是连续存储在内存中的数据结构,因此它的优势是可以通过下标迅速的找到元素的位置,而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动,为了解决 ...
- python比java好学吗-到底学Python还是Java?一张图PK明白!
魔爪营科技教育 编程启蒙/科学思维 |Scratch|Arduino|JAVA|科学探索| Java 和 Python 一直都是两种很火很强大的编程语言,对于刚开始起步学习编程的同学来说,会迷惑且最经 ...
- java 自定义注解_Java注解
前言 近日在阅读开源项目,发现项目里好多奇奇怪怪的注解(@DataScope.@Log...)看得我一脸懵,不知道大家是否也有过这样的经历,回想了一下,发现自己对于注解的知识,好像只停留在@Overr ...
最新文章
- C# 8的新提案:new关键字类型推断
- 学习:二维码、QR码、J4L-QRCode、java
- 【目标检测】Fast RCNN算法详解
- 小区物业费信息管理系统设计c++_律师,我没有签物业合同,可以不交物业费吗?...
- c语言编程 输入螺旋数组,C语言 经典题目螺旋矩阵 实例详解
- linux基础命令学习(四)用户与群组
- 一文读懂云原生一体化数仓
- Java笔记-基于Spring Boot的SOAP双向SSL认证及WS-Security
- javascript中索引_如何在JavaScript中找到数字在数组中所属的索引
- java零碎要点013---JAVA执行js_java执行JavaScript_java执行js引擎不能识别document浏览器内置对象解决办法
- Cesium 学习笔记
- 什么是悬空 Docker 镜像?
- 为什么python文件用cmd老是出现语法错误_关于Python的py文件在Python自带的shell编辑器中运行成功,用cmd打开运行却出错 在cmd下运行结果...
- 微信小程序+SpringBoot实现校园快递代收平台
- 三菱PLC模板程序FX5U轴FB块 使用ST语言编写的轴FB块,包含原点复归,点动,定位运动
- 一分钟了解矩阵、方阵、对角矩阵、单位矩阵之间的关系
- 猜数字小游戏(Python)
- mysql数据库是的缩写_MYSQL数据库命名与其设计规范
- Web端H.265播放器研发解密 1
- java观看视频次数_java数字转换视频播放次数等
热门文章
- NetGear 路由器任意执行漏洞
- 高教版《管理学》(第四版)重点知识整理
- 73. 如何手动通过增强的方式,给 SAP ABAP 数据库表增添新的字段
- 基于XCP(On CAN)协议的Bootloader升级方案
- 爬虫(6)—— 淘宝商品比价定向爬虫
- 微信小程序css鼠标上去变色,微信小程序实现默认第一个选中变色效果
- Matlab中title函数使用
- Windows下jupyter notebook 修改主题、字体、字号等以及各个主题的样式的展示、插件的安装等
- 互联网,传递人性正能量
- mount函数C语言代码,C++ mount函数