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注解--一张图一案例掌握自定义注解的更多相关文章

  1. Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合

    内省的简单运用: JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则. 采用遍历BeanInfo的所有属性方式来查找和 ...

  2. Java 中待总结工具类学习(自定义注解,读取配置,字面List)

    1.使用 MessageFormat 格式化文本 int planet = 7; String event = "a disturbance in the Force"; Stri ...

  3. JAVA比较两张图相似度

    代码: package com.uiwho.com; import javax.imageio.*; import java.awt.image.*; import java.awt.*;//Colo ...

  4. java之aop使用及自定义注解

    目的: 1.Java注解简介 2.Java元注解(重点) 3.自定义注解 案例一(获取类与方法上的注解值) 案例二(获取类属性上的注解属性值) 案例三(获取参数修饰注解对应的属性值) 4.Aop自定义 ...

  5. Java 自定义注解

    在spring的应用中,经常使用注解进行开发,这样有利于加快开发的速度. 介绍一下自定义注解: 首先,自定义注解要新建一个@interface,这个是一个注解的接口,在此接口上有这样几个注解: @Do ...

  6. Java自定义注解开发

    一.背景 最近在自己搞一个项目时,遇到可需要开发自定义注解的需求,对于没有怎么关注这些java新特性的来说,比较尴尬,索性就拿出一些时间,来进行研究下自定义注解开发的步骤以及使用方式.今天在这里记下, ...

  7. Java注解教程及自定义注解

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  8. Java基于自定义注解的面向切面的实现

    目的:实现在任何想要切的地方添加一个注解就能实现面向切面编程 自定义注解类 @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retentio ...

  9. Java自定义注解的使用

    什么是注解? #============================================================================================ ...

  10. 160621、Java注解教程及自定义注解

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

随机推荐

  1. 使用命令行方式搭建uni-app + Vue3 + Typescript + Pinia + Vite + Tailwind CSS + uv-ui开发脚手架

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. 结构体中ElementType的使用

    1.问题 在定义结构体时,对于元素值,为什么喜欢使用ElementType而不是直接使用int或者char等等? 2.结论 对于int get_result(int x); 和 int get_res ...

  3. CSS - 怎么样在不同分辨率的情况下计算根元素需要的font-size的值

    一般我们做页面,肯定都会有设计图,移动端页面,一般情况下,UI出图都会定宽为640px,这也是移动端的标准尺寸:但是,我们也不能排除可能有其他特殊的情况可能需要做其他大小的设计图.所以,我们可以先定一 ...

  4. [转帖]细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

    https://www.cnblogs.com/malecrab/p/5300503.html 1. Unicode与ISO 10646 全世界很多个国家都在为自己的文字编码,并且互不想通,不同的语言 ...

  5. Redis不同版本性能研究

    Redis不同版本性能研究 背景 前期同事遇到了一个大key的慢查询. 前提条件是: 一个 60万key的环境里面. 有一个 260万元素的set类型的key 产品经常会进行 smember key ...

  6. [转帖]【VIM】多行缩进空格与删除

    向前或向后缩进一个TAB 按ctrl + v组合键进入Visual Line模式,可使用方向键选择多行: 按<或>,进行向前或向后缩进tab. 缩进n个TAB,按n+<或> 多 ...

  7. [转帖]Shell 判断文件或文件夹是否存在(不存在则创建)

    目录 1. 文件夹不存在创建文件夹 2. 判断文件夹是否存在 3. 判断文件是否存在 4. 常用的文件比较符 1. 文件夹不存在创建文件夹 if [ ! -d "/data/" ] ...

  8. CentOS7 RPM离线安装PG12的办法

    1. 先需要下载相应的rpm包 地址 https://pkgs.org/search/?q=postgresql12 一般至少要下载如下四个包 postgresql12-12.3-1PGDG.rhel ...

  9. 【K哥爬虫普法】老铁需要车牌靓号吗?判刑的那种

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  10. 每日一库:Memcache

    Memcache 是一个高性能.分布式的内存缓存系统,常用于缓存数据库查询结果.API调用结果.页面内容等,以提升应用程序的性能和响应速度.下面详细介绍一些 Memcache 的特点和使用方式: 内存 ...