注解与反射接口AnnotatedElement

定义注解后,如何获取注解中的内容呢?反射包java.lang.reflect下的AnnotatedElement接口提供这些方法。这里注意:只有注解被定义为RUNTIME后,该注解才能是运行时可见,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取。

AnnotatedElement 中需要了解的API

AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的方法来访问Annotation信息。

AnnotatedElement 接口API 如下

  • boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
    判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false

  • T getAnnotation(Class annotationClass)
    返回该程序元素上存在的、指定类型的注解。如果没有则返回null。

  • Annotation[] getAnnotations()
    返回该程序元素上存在的所有注解。如果没有则返回空数组[]。

  • T[] getAnnotationsByType(Class annotationClass)
    返回该程序元素上存在的、指定类型的注解数组。如果没有则返回空数组[]。getAnnotationsByType方法与 getAnnotation的区别在于,getAnnotationsByType 会检测封装在注解容器的注解

  • T getDeclaredAnnotation(Class annotationClass)
    返回直接存在于此元素上的所有注解(会忽略继承的注解)。如果没有则返回null。

  • Annotation[] getDeclaredAnnotations()
    返回直接存在于此元素上的所有注解及注解对应的重复注解容器(会忽略继承的注解。如果没有则返回空数组[]。

  • T[] getDeclaredAnnotationsByType(Class annotationClass)
    返回直接存在于此元素上的所有注解(会忽略继承的注解,会检测封装在注解容器的注解)。如果没有则返回空数组[]。

测试案例如下:

准备 User 注解类(可重复使用)

package com.gump.annotation.repeatable;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Users.class)//可使用重复注解
public @interface User {String value();
}

准备 Users 注解类(容器注解)

package com.gump.annotation.repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Users {User[] value();
}

准备 Country 注解类(可继承)

package com.gump.annotation.repeatable;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Inherited//子类可继承
public @interface Country {String value();
}

准备 MyClass 子类

package com.gump.annotation.repeatable;
@User("you")
@User("me")
public class MyClass extends ParentClass {//...
}

准备 ParentClass 父类

package com.gump.annotation.repeatable;
@Country("China")
public class ParentClass {
}

准备 测试类,开始验证测试(着重理解方法之间的对比区别):

package com.gump.annotation.repeatable;
import java.lang.annotation.Annotation;
public class MyTest {public static void main(String[] args) {Class<MyClass> clazz = MyClass.class;boolean isUsers = clazz.isAnnotationPresent(Users.class);//trueboolean isUser = clazz.isAnnotationPresent(User.class);//false,不会检测封装在注解容器的注解Userboolean isCountry = clazz.isAnnotationPresent(Country.class);//trueUsers users = clazz.getAnnotation(Users.class);User user = clazz.getAnnotation(User.class);//null,会检测封装在注解容器的注解Country country = clazz.getAnnotation(Country.class);Annotation[] annotations = clazz.getAnnotations();//Users、Country,不会检测封装在注解容器的注解UserUsers[] annotationsByType1 = clazz.getAnnotationsByType(Users.class);User[] annotationsByType2 = clazz.getAnnotationsByType(User.class);//会检测封装在注解容器的注解UserCountry[] annotationsByType3 = clazz.getAnnotationsByType(Country.class);Users declaredAnnotation1 = clazz.getDeclaredAnnotation(Users.class);User declaredAnnotation2 = clazz.getDeclaredAnnotation(User.class);//null,不会检测封装在注解容器的注解UserCountry declaredAnnotation3 = clazz.getDeclaredAnnotation(Country.class);//null,忽略继承Annotation[] declaredAnnotations = clazz.getDeclaredAnnotations();//Users,忽略继承Country,不会检测封装在注解容器的注解UserUsers[] declaredAnnotationsByType1 = clazz.getDeclaredAnnotationsByType(Users.class);User[] declaredAnnotationsByType2 = clazz.getDeclaredAnnotationsByType(User.class);//会检测封装在注解容器的注解UserCountry[] declaredAnnotationsByType3 = clazz.getDeclaredAnnotationsByType(Country.class);//返回[],忽略继承}
}

测试对比小结:

  • 包含 Declared 的方法会忽略继承的注解;
  • 包含 ByType 的方法会检测封装在注解容器的注解;

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

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

相关文章

DDIM学习笔记

写在前面&#xff1a; &#xff08;1&#xff09;建议看这篇论文之前&#xff0c;可先看我写的前一篇论文&#xff1a; DDPM推导笔记-大白话推导 主要学习和参考了以下文章&#xff1a; &#xff08;1&#xff09;一文带你看懂DDPM和DDIM &#xff08;2&#xff09;关于 DDIM …

音频文件元数据:批量修改技巧,视频剪辑高效修改元数据的方法

随着数字媒体技术的快速发展&#xff0c;音频文件已成为日常生活中的重要组成部分。无论是音乐、语音还是其他音频内容&#xff0c;元数据都是描述这些文件的重要信息。下面来看下云炫AI智剪如何批量修改音频文件元数据&#xff0c;在视频剪辑中高效修改元数据的方法。 下面来看…

Java常用类---包装类

包装类 包装类简介 Java语言是典型的面向对象编程语言&#xff0c;但是其中的8种基本数据类型并不支持面向对象编程&#xff0c;基本类型数据不具备"对象"的特性&#xff0c;即&#xff1a;没有携带属性以及没有方法可以调用。 为了解决上述问题&#xff0c;java为…

strtok函数的介绍

_str指被分解的字符串 delim指分隔符字符串 返回类型是指针 strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串&#xff0c;参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符…

【论文阅读笔记】Dichotomous Image Segmentation with Frequency Priors

1. 论文介绍 Dichotomous Image Segmentation with Frequency Priors 基于频率先验的二分图像分割 2023年发表在IJCAI Paper Code 2. 摘要 二分图像分割&#xff08;DIS&#xff09;具有广泛的实际应用&#xff0c;近年来得到了越来越多的研究关注。本文提出了解决DIS与信息…

vue项目 Network: unavailable的解决办法

vue项目npm run serve 后&#xff0c;只有localhost访问&#xff0c;network不能访。 看到网上说有三种情况&#xff1a; 多个网卡原因&#xff1a;打开网络共享中心&#xff0c;把多余的网络禁用掉&#xff0c;只留一个 在中配置host及public 系统环境变量问题…

Redis高并发高可用(主从复制、哨兵)

复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Redis的基础,哨兵和集群都是在复制的基础上实现高可用的。 默认…

实战:使用docker容器化服务与文件挂载-2

接着上文&#xff0c;演示Elasticsearch 和 Kibana 的安装&#xff0c;并讲解文件挂载 Elasticsearch of Docker &#xff08;Kibana&#xff09; 1、Elasticsearch 安装 ElasticSearch 使用 Docker 安装&#xff1a;https://www.yuque.com/zhangshuaiyin/guli-mall/dwrp5b 1.…

php实现支付宝商户转账

目录 一&#xff1a;背景介绍 一&#xff1a;准备工作 三&#xff1a;代码实现 一&#xff1a;背景介绍 最近工作中&#xff0c;要用到支付宝的商家转账功能&#xff0c;用php代码实现&#xff0c;网上找的内容&#xff0c;有些是老版本的实现&#xff0c;有些是调用sdk&am…

引领创新的软件开发和新技术实践

在快速发展的科技时代&#xff0c;软件开发领域不断涌现出新的技术和创新方法。通过引领创新的软件开发和积极应用新技术&#xff0c;团队可以更好地适应市场需求&#xff0c;提高产品竞争力。本文将介绍一些引领创新的软件开发和新技术实践。 1. 敏捷开发和迭代模型 采用敏捷…

【经验分享】如何看论文的分区、SCI检索号、EI检索号等信息

0 前言 一般而言&#xff0c;被SCI检索的论文&#xff0c;都会同时被EI检索。我们以论文《Learning Disentangled Representation for Multimodal Cross-Domain Sentiment Analysis》为例&#xff0c;讲解一下如何查询论文的各项信息。 我们首先百度这个论文 可以看到它是发表…

【MYSQL】性能相关

SQL 语句的性能分析是一个非常重要的任务&#xff0c;尤其是在处理大数据时。下面是一些常用的 SQL 性能分析方法&#xff1a; 执行计划: 使用 EXPLAIN 命令来查看 SQL 语句的执行计划。这可以帮助你了解查询是如何被数据库执行的&#xff0c;从而发现可能的性能瓶颈。 注意&…

Android性能优化系列——内存优化

内存&#xff0c;是Android应用的生命线&#xff0c;一旦在内存上出现问题&#xff0c;轻者内存泄漏造成App卡顿&#xff0c;重者直接crash&#xff0c;因此一个应用保持健壮&#xff0c;要做好内存的使用和优化。网上有很多讲JAVA内存虚拟机的好文章&#xff0c;我就不赘述了。…

C#请求队列后台服务

队列执行 1、首先需要一个公共类里面有我们的队列需要执行的方法 这个方法最好是一个单独的不受别的控制器影响的class。因为你如果声明错位置的话一不小心就会把我们的队列重置。导致队列内容丢失造成损失。大家如果有某些方法运行时间太长但又需要快速给出结果&#xff0c;…

SQL必知必会笔记(9~12章)

第九章 汇总数据 1、聚集函数用来进行记录数据的加工&#xff0c;然后再进行返回。 2、SQL的聚集函数&#xff1a; 函数 说明 AVG() 返回某列的平均值 COUNT() 返回某列的行数 MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某列值之和 3、AVG()函数 A…

想要成为机器学习领域的高手吗?这里有五本必读免费书,订阅周报发链接 (下)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Azure AI 内容安全Content Safety Studio实战

Azure AI Content Safety 检测应用程序和服务中用户生成和 AI 生成的有害内容。 Azure AI 内容安全包括文本和图像 API&#xff0c;可用于检测有害材料。 交互式 Content Safety Studio&#xff0c;可用于查看、浏览和试用用于检测不同形式的有害内容的示例代码。 关注TechLead…

项目框架构建之6:编写通用主机基础类

本文是“项目框架构建”系列之6&#xff0c;本文介绍如何编写通用主机基础类。 1.为了构建通用主机&#xff0c;我们先创建主机接口IAppHost接口 接口需要有配置项&#xff0c;我们定义为HostConfiguration&#xff0c;比如我们希望用户可以设定他的工作目录&#xff0c;就可…

深度学习|4.7 参数和超参数

4.7 参数和超参数 超参数是指需要用户提前设置好的参数&#xff0c;这些超参数最终会影响到参数的数值&#xff08;相当于参数是动态调整得到的&#xff09; 学习率的选取 最优学习率应该能使得代价函数趋于一个较低的常数。

接口工具Apifox

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点&#xff1a; 接口文档定义&#xff1a; Apif…