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

news2025/1/11 20:45:01

一、什么是注解

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());
        }
    }
}

测试结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日一题】【LeetCode】【第十一天】杨辉三角

解决之路 题目描述 测试案例&#xff08;部分&#xff09; 第一次 杨辉三角感觉还是挺经典的代码题目&#xff1f;之前大一学C语言好像写过一次。 不过&#xff0c;自己当时就不会写&#xff0c;这次自己先试试能不能想出解决方案。 输入数字是几&#xff0c;那就要输出几…

亚马逊云科技帮助Gemsouls在云上快速实现技术验证与部署

元宇宙热度居高不下&#xff0c;它所创造的虚拟世界进一步拉近了人与人之间的距离&#xff0c;用数字化的形式消除地理与空间上的隔阂。而高度拟真化的虚拟人与AI虚拟社交&#xff0c;是元宇宙落地的重要领域&#xff0c;打造以人工智能驱动的虚拟人社交平台已成为行业大势。 …

DNS 的一些基础知识,以及 DNS 转换域名的过程

DNS(Domain Name System)&#xff0c;主要作用是将域名转成 IP&#xff0c;本文主要讲解了 DNS 的一些基础知识&#xff0c;以及 DNS 转换域名的过程。DNS 是什么dig命令绝大多数网络通信都是基于 TCP/IP 协议&#xff0c;而 TCP/IP 协议的基础是 IP&#xff0c;所以网络中的计…

获取未来时间 一年或N年

需求 展示从本月初开始 一年的时间 或N年的时间 以便用户选择思路 一年12个月 是已知的 从本月到12月可以生成本年的每天数据从1月至上月可以生成所需得到最后一年的数据今年加最后一年的月份可拼接一年时间 所以中间年份是所需年分-1的数组数据中间年份都是1-12月 可以通过年份…

软件的生命周期和测试的生命周期的区分

软件的生命周期测试的生命周期软件测试贯穿于软件的整个生命周期在需求分析阶段测试人员的活测试人员需要站在用户角度分析&#xff1a;软件需求是否合理&#xff1b;站在技术角度分析&#xff1a;技术上是否可行&#xff0c;还有没有优化的空间&#xff1b;站在测试角度分析&a…

VALL-E:微软全新语音合成模型可以在3秒内复制任何人的声音

近日&#xff0c;微软研究人员宣布了一种新的语音合成AI模型 VALL-E&#xff0c;给出3秒样音就可以精确地模拟一个人的声音。一旦它学会了一个特定的声音&#xff0c;VALL-E可以复制说话者的情绪和语气&#xff0c;即使说话者本人从未说过的单词也可以模仿。 论文地址&#xf…

xlCompiler转换为程序的优秀工具

xlCompiler转换为程序的优秀工具 xlCompiler是将oxel文件转换为程序的优秀工具。无需担心删除oxel文件中使用的宏和公式。该工具将您所做的转换为Exe可执行文件&#xff0c;这比分发原始文件时要低得多。最终的文件不需要氧气来执行&#xff0c;您也会有一种在简单的氧气环境中…

D. Friendly Spiders(bfs+筛法)

传送门题意&#xff1a;给你n个蜘蛛&#xff0c;每个蜘蛛有自己的腿数&#xff0c;如果某两个蜘蛛可以直接联系&#xff0c;那么这两个蜘蛛的最大公约数就不为1&#xff0c;否则这两只蜘蛛就不能直接联系。现在给你两个蜘蛛的序号i,j问这两只蜘蛛是否可以直接或者通过其他的蜘蛛…

SDK安全专项评测证书

SDK安全专项行动”是中国信息通信研究院安全研究所大数据应用与安全创新实验室共同发起的&#xff0c;实验室紧跟信息技术发展趋势&#xff0c;依托数据安全、移动安全等领域深厚积累&#xff0c;通过前瞻研究和实践探索&#xff0c;形成了完整的SDK评测方案和指标体系。 SDK产…

【HCIA-openEuler】实验手册—05【openEuler软件管理】

文章目录一、实验介绍1、内容描述2、实验目的二、配置Yum源步骤1&#xff1a;进入yum repo目录步骤2&#xff1a;更改openEuler_x86_64.repo文件步骤3&#xff1a;刷新列出软件列表三、使用RPM命令管理软件1、RPM查询命令步骤1&#xff1a;执行以下命令&#xff0c;通过yum和rp…

华为DHCP实验配置

配置AR1为PC2分配地址 dhcp enable ip pool DHCP_PC2 network 192.168.20.200 mask 24 gateway-list 192.168.20.254 dns-list 192.168.20.100 excluded-ip-address 192.168.20.100 int g0/0/1 ip address 192.168.20.254 24 dhcp select global 配置AR1为PC3分配IP地址 dhcp e…

一个令人赞不绝口的代码 Debug 神器

在编写程序时&#xff0c;无论是对于初学者还是对于专业开发人员&#xff0c;都会花费大量时间来调试或修复源代码错误&#xff0c;也就是 Debug。 这个过程繁琐复杂&#xff0c;包括 Bug 复现和 Bug 定位等环节。如果有了自动化的 Debug 程序&#xff0c;就可以显著提高编程实…

Three.js一学就会系列:05 加载3D模型

系列文章目录 Three.js一学就会系列&#xff1a;01 第一个3D网站 Three.js一学就会系列&#xff1a;02 画线 Three.js一学就会系列&#xff1a;03 炫酷3D划线 Three.js一学就会系列&#xff1a;04 炫酷3D文字 文章目录系列文章目录前言一、核心代码讲解引入插件轨道控制器加载…

ES6 课程概述⑤

文章目录9-1. Fetch Api 概述9-2. 基本使用参数返回值9-3 **Response 对象**9-4 Request 对象9-5 Headers 对象9-6 文件上传10-1 迭代器背景知识JS 中的迭代器可迭代协议 与 for-of 循环可迭代协议for-of 循环展开运算符与可迭代对象生成器 (Generator)set 集合9-1. Fetch Api …

Unity 之 Addressable可寻址系统 -- 代码加载介绍

Unity 之 可寻址系统 -- 代码加载介绍 -- 进阶&#xff08;一&#xff09;一&#xff0c;可寻址系统代码加载1.1 回调形式1.2 异步等待1.3 面板赋值1.4 同步加载二&#xff0c;可寻址系统分标签加载2.1 场景搭建2.2 代码示例2.3 效果展示三&#xff0c;代码加载可寻址的解释概述…

算法第九期——DFS(深度优先搜索)的树上应用

树 树是一种特殊的图 。 特点&#xff1a; 若树有n个点,则有n-1条边。树有连通性但没有回路。从一个点出发可以到达任意一个&#xff0c;而且路径是唯一的。树的重心u&#xff08;最平衡的点&#xff09;: 以树上任意一个结点为根计算它的子树的结点数&#xff0c;如果结点…

二部图和匈牙利算法

1.二分图最大匹配 设G为二分图,若在G的子图M中,任意两条边都没有公共节点,那么称M为二分图G的一组匹配。在二分图中,包含边数最多的一组匹配称为二分图的最大匹配。 交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。 …

【算法】深度优先搜索 (DFS)

目录1.概述2.代码实现3.应用1.概述 &#xff08;1&#xff09;深度优先遍历 (Depth First Search, DFS)&#xff0c;是图的搜索算法之一&#xff0c;本质其实就是一个递归的过程&#xff0c;它就像是一棵树的前序遍历。 &#xff08;2&#xff09;DFS 从图中某个顶点 start 出…

游戏如何解决注入挂难题

游戏黑灰产的攻击角度除了常见的内存修改、模拟点击、破解等作弊手段&#xff0c;还有门槛相对较高的「专用插件类」。 专用插件类外挂是指针对特定游戏定制的外挂&#xff0c;其在实现方式上&#xff0c;类似插件&#xff0c;也称“定制挂”、“注入挂”。 游戏面临多样化的安…

招聘老师的最佳实践及工作交流坊

香港 — 如果你在招聘外籍老师途中遇到极大的挑战&#xff0c;你并不是孤独的。由于新冠肺炎的限制及对于外籍老师的需求增加&#xff0c;招聘及留住高质量的外籍老师对于学校来说已经越来越困难。在疫情之下&#xff0c; 许多学校展现了非凡的韧性来确保他们的教学质量及学习供…