java注解以及如何利用反射获取注解的属性值

一、什么是注解

1.Annotation是从JDK5.0开始引入的新技术

2.Annotation的作用 :

  • (1)不是程序本身,可以对程序作出解释(这一点和注释(comment)没什么区别)
  • (2)可以被其他程序(比如:编译器等)读取

3.Annotation的格式:

注解是以"@注释名"在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value=“unchecked”)

Annotation在哪里使用?

可以附加在package , class , method , field 等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问

二、内置注解

  • 1.@Override :定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明
  • 2.@Deprecated :定义在java.lang.Deprecated中, 此注释可以用于修辞方法,属性,类,表示不鼓励程序员使用这样的元素, 通常是因为它很危险或者存在更好的选择
  • 3.@SuppressWarnings :定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的,我们选择性的使用就好了
    (1)@SuppressWarngs(“all”)
    (2)@SuppressWarnings(“unchecked”)
    (3)@SuppressWarnings(value={“unchecked”,“deprecation”})等等

三、元注解

  • 1.元注解的作用就是负责注解其他注解, Java定义了4个标准的meta- annotation类型,他们被用来提供对其他annotation类型作说明
  • 2.这些类型和它们所支持的类在java.lang.annotation包中可以找到( @Target , @Retention ,@Documented , @Inherited )
    (1)@Target :用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
    (2)@Retention :表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE < CLASS < RUNTIME(默认))
    (3)@Document: 说明该注解将被包含在javadoc中
    (4)@Inherited:说明子类可以继承父类中的该注解

四、自定义注解

  • 1.使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
  • 2.分析:
    (1) @ interface用来声明一个注解,格式: public @ interface注解名{定义内容}
    (2)其中的每一个方法实际上是声明了一个配置参数
    (3)方法的名称就是参数的名称
    (4)返回值类型就是参数的类型(返回值只能是基本类型,Class , String , enum )
    (5)可以通过default来声明参数的默认值
    (6)如果只有一个参数成员, 一般参数名为value(可以不用写参数名直接设置)
    (7)注解元素必须要有值,我们定义注解元素时, 经常使用空字符串,0作为默认值

五、如何利用反射获取注解内容

注解类

package com.ymf.invoice.common.annotation;

import java.lang.annotation.*;

/**
 * @ClassName: ExcelHeaderUtil
 * @author: 〆、dyh
 * @since: 2023/1/13 10:40
 */

@Documented
@Retention(RetentionPolicy.RUNTIME)//@Retention :表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE < CLASS < RUNTIME(默认))
@Target(ElementType.FIELD)//@Target :用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
public @interface ExcelHeaderAnnotation {
    
    //@ interface用来声明一个注解,格式: public @ interface注解名{定义内容}
    //注解参数: 参数类型 参数名();如果没有default值就必须要给注释赋值;如果只有一个参数时,使用value可以直接赋值
    String name() default "";//如果默认值为-1,代表不存在,indexOf如果找不到就返回-1

    int sort() default 0;//如果默认值为-1,代表不存在,indexOf如果找不到就返回-1

    int width() default 5000;//如果默认值为-1,代表不存在,indexOf如果找不到就返回-1


}

实体类

package com.ymf.invoice.common.excel;

import com.ymf.invoice.common.annotation.ExcelHeaderAnnotation;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * @ClassName: InvoiceImgExcel
 * @author: 〆、dyh
 * @since: 2023/1/11 14:56
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class InvoiceImgExcel implements Serializable {
    
    
    @ExcelHeaderAnnotation(sort = 0, name = "序号")
    private int serialNumber;

    @ExcelHeaderAnnotation(sort = 1, name = "供应商名称")
    private String sellerName;

    @ExcelHeaderAnnotation(sort = 2, name = "发票号码")
    private String invoiceNumber;

    @ExcelHeaderAnnotation(sort = 3, name = "金额(元)")
    private BigDecimal taxIncludeDamountinfigures;

    @ExcelHeaderAnnotation(sort = 4, name = "开票日期")
    private String issueDate;

    @ExcelHeaderAnnotation(sort = 5, name = "签收日期")
    private LocalDateTime signInTime;

    @ExcelHeaderAnnotation(sort = 6, name = "备注")
    private String signInMark;
}

Test类

package com.ymf.invoice.domain.service.impl;

import com.ymf.invoice.common.annotation.ExcelHeaderAnnotation;
import com.ymf.invoice.common.excel.InvoiceImgExcel;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @ClassName: Test
 * @author: 〆、dyh
 * @since: 2023/1/13 11:03
 */

public class Test {
    
    
    public static void main(String[] args) {
    
    
        //反射获取类对象
        Class<InvoiceImgExcel> invoiceImgExcelClass = InvoiceImgExcel.class;
        //获得所有字段
        Field[] declaredFields = invoiceImgExcelClass.getDeclaredFields();
        List<ExcelHeaderAnnotation> excelHeaderAnnotations = new ArrayList<>();
        for (Field field : declaredFields) {
    
    
            ExcelHeaderAnnotation annotation = field.getAnnotation(ExcelHeaderAnnotation.class);
            excelHeaderAnnotations.add(annotation);
        }
        List<ExcelHeaderAnnotation> collect = excelHeaderAnnotations.stream().sorted(Comparator.comparing(ExcelHeaderAnnotation::sort)).collect(Collectors.toList());
        for (ExcelHeaderAnnotation excelHeaderAnnotation : collect) {
    
    
            System.out.println("name====================>" + excelHeaderAnnotation.name());
            System.out.println("sort====================>" + excelHeaderAnnotation.sort());
            System.out.println("width====================>" + excelHeaderAnnotation.width());
        }
    }
}

测试结果

在这里插入图片描述