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. 问题--链表指针传参,修改next指针只传值

    1.问题--链表指针传参,修改next指针只传值 Link_creat_head(&head, p_new);//将新节点加入链表 在这当中head头指针传的是地址,而p_new传的是值,这二 ...

  2. PageHelper 分页不起作用

    将 reasonable 设置为 false   .

  3. css - 去掉图片下的白边

    造成原因: 图片的 display 属性默认是 inline ,而这个属性的 vertical-align 的默认值是baseline. 解决办法1( 建议使用block ,  对 ie浏览器 比较友 ...

  4. [转帖]OceanBase 4.2.1 LTS 发版 | 一体化数据库首个长期支持版本

    2013.11.20 https://open.oceanbase.com/blog/7746655008?_gl=1*1qv10rf*_ga*Nzk3MjIxOTk0LjE3MDI2MTAxMzk. ...

  5. [转帖]MySQL的版本情况

    Introducing MySQL Innovation and Long-Term Support (LTS) versions (oracle.com) Introducing MySQL Inn ...

  6. Oracle Preinstall 调优参数的学习

    Oracle Preinstall 调优参数的学习 背景 学习是一个痛苦并快乐的过程. 之前自己手工安装过很多套Oracle数据库,也总结过很多 但是很多都是比较皮毛的. 最近遇到了一些问题. 才发现 ...

  7. [转帖]br备份时排除某个库

    https://tidb.net/blog/2a88149e?utm_source=tidb-community&utm_medium=referral&utm_campaign=re ...

  8. [转帖]Nginx优化与防盗链

    目录 一.配置Nginx隐藏版本号 1.第一种方法修改配置文件 2.第二种方法修改源码文件,重新编译安装 二.修改Nginx用户与组 三.配置Nginx网页缓存时间 四.实现Nginx的日志分割 五. ...

  9. 【转帖】bpftrace 指南

    文章目录 0. bpftrace 0.1 bpftrace组件 0.2 bpftrace 帮助信息 0.3 bpftrace 工具速览表 0.4 bpftrace 探针 0.4.1 tracepoin ...

  10. 你不知道的<input type="file">的小秘密

    限制file上传类型 很多时候,我们都需要使用 <input type="file"> 进行文件上传. 在上传的时候,我们需要对文件类型进行限制. 如果上传图片的时候. ...