一、什么是注解
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());
}
}
}