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;
}
@Override
public 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();//注解打在私有成员变量,所以要用getDeclaredFields
for (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---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合
内省的简单运用: JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则. 采用遍历BeanInfo的所有属性方式来查找和 ...
- Java 中待总结工具类学习(自定义注解,读取配置,字面List)
1.使用 MessageFormat 格式化文本 int planet = 7; String event = "a disturbance in the Force"; Stri ...
- JAVA比较两张图相似度
代码: package com.uiwho.com; import javax.imageio.*; import java.awt.image.*; import java.awt.*;//Colo ...
- java之aop使用及自定义注解
目的: 1.Java注解简介 2.Java元注解(重点) 3.自定义注解 案例一(获取类与方法上的注解值) 案例二(获取类属性上的注解属性值) 案例三(获取参数修饰注解对应的属性值) 4.Aop自定义 ...
- Java 自定义注解
在spring的应用中,经常使用注解进行开发,这样有利于加快开发的速度. 介绍一下自定义注解: 首先,自定义注解要新建一个@interface,这个是一个注解的接口,在此接口上有这样几个注解: @Do ...
- Java自定义注解开发
一.背景 最近在自己搞一个项目时,遇到可需要开发自定义注解的需求,对于没有怎么关注这些java新特性的来说,比较尴尬,索性就拿出一些时间,来进行研究下自定义注解开发的步骤以及使用方式.今天在这里记下, ...
- Java注解教程及自定义注解
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
- Java基于自定义注解的面向切面的实现
目的:实现在任何想要切的地方添加一个注解就能实现面向切面编程 自定义注解类 @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retentio ...
- Java自定义注解的使用
什么是注解? #============================================================================================ ...
- 160621、Java注解教程及自定义注解
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
随机推荐
- 如何让golang的web服务热重载
有很多方法可以热重载 golang Web 应用程序或 golang 程序. 我选择gin(不是web gin框架)来进行热重载. 首先在 GOPATH/bin下安装gin,命令如下所示: go ge ...
- 战略设计- DDD
随着系统的增长,它会变得越来越复杂,当我们无法通过分析对象来理解系统的时候,就需要掌握一些操纵和理解大模型的技术了.本文将介绍一些原则.遵循这些原则,就可以对非常复杂的领域进行建模.大部分这样的决策都 ...
- [转帖]ASH、AWR、ADDM区别联系
==================================================================================================== ...
- [转帖]docker-compose完全清除
https://www.cnblogs.com/gelandesprung/p/12112420.html#:~:text=docker-compose%E5%AE%8C%E5%85%A8%E6%B8 ...
- [转帖]jmeter实现分布式压测
分布式实现的前提条件: 1.master机器和奴隶机的jmeter要一致 a. jmeter版本要一致 b.jdk主要版本要一致,比如都是jdk1.8,后面的小版本不一样不影响 c.jmeter脚本中 ...
- [转帖]configure: error: cannot guess build type;you must specify one
该问题一般出现在国产平台,从错误描述来看,意思是:无法猜测build类型,你必须指定一个. 解决办法: 1. 在系统/usr路径下搜索 config.guess 和 config.sub 这两个文件. ...
- 【转帖】FIO磁盘性能测试工具
https://www.jianshu.com/p/70b8c7d5d217 FIO工具介绍 FIO 工具是一款用于测试硬件存储性能的辅助工具,兼具灵活性.可靠性从而从众多性能测试工具中脱颖而出.磁盘 ...
- Sysbench简单测试数据库性能
摘要 先进行了一个PG数据库的测试. Mysql数据库的测试稍后跟上. 紧接着上一篇的安装, 部分文件可能需要特定路径才可以. sysbench 测试的说明 一个参数 这里稍微说一下参数的问题 sys ...
- Linux 查询最近占用内存最多的十个进程的方法
ps -eo rss,pid,user,command --sort -rss | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { ...
- 获取特定端口java进程的路径的shell脚本
获取特定端口java进程的路径的shell脚本 ll /proc/`lsof -i:5200 |grep ^java |awk '{print $2}' |uniq` |grep cwd |cut - ...