Java Reflect如何利用反射获取属性上的注解

 更新时间:2024年09月27日 08:49:59   作者:我一直在流浪  
AnnotatedElement接口是Java反射机制的一部分,用于读取运行中程序的注释信息,通过getAnnotation、getAnnotations、isAnnotationPresent和getDeclaredAnnotations方法,可以访问和判断注解,Field类实现了该接口

1. AnnotatedElement接口

AnnotatedElement接口表示目前正在此 JVM 中运行的程序的一个已注释元素,该接口允许反射性地读取注释。

调用AnnotatedElement对象的如下方法可以访问Annotation信息:

  • getAnnotation(Class<T>annotationClass):返回该程序元素上存在的指定类型的注释,如果该类型的注释不存在,则返回null。
  • Annotation[] getAnnotations():返回此元素上存在的所有注释。
  • boolean isAnnotationPresent(Class<?extendsAnnotation>annotationClass):判断该程序元素上是否存在指定类型的注释,如果存在则返回true,否则返回false。
  • Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。

2. Field类实现了AnnotatedElement接口

3. 获取属性上的注解

① 自定义注解

@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER} )
public @interface MyParam1 {

    String value() default "";
}
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.PARAMETER} )
public @interface MyParam2 {

    String value() default "";
}

② 给方法参数上添加注解

@ControllerAdvice
@Controller
@MyAnnotation(name = "李四",age=12)
public class Test {

    @MyField1("name1")
    @MyField2("name2")
    @Value("name")
    private String name;

    @MyField1("email1")
    @MyField2("email2")
    @Value("email")
    private String email;

}

③ 获取属性上的注解

public class Main {
    public static void main(String[] args) throws NoSuchMethodException, ClassNotFoundException {
        // 得到Class类对象
        Class<?> clazz = Class.forName("com.example.redislock.annotation.Test");

        // 获取类的所有属性
        Field[] fields = clazz.getDeclaredFields();

        // 获取属性上的所有注解
        int i = 1;
        for (Field field : fields) {
            System.out.println("第"+i+++"个属性的注解有:");
            Annotation[] annotations = field.getAnnotations();
            for (Annotation annotation : annotations) {
                System.out.println(annotation.annotationType());
            }
        }

        // 获取属性上指定MyField2类型的注解
        System.out.println();
        System.out.println("获取属性上指定MyField2类型的注解:");
        for (Field field : fields) {
            MyField2 myField2 = field.getAnnotation(MyField2.class);
            System.out.println(myField2);
            System.out.println(myField2.value());
        }

        // 获取属性上指定MyField2类型的注解
        System.out.println();
        System.out.println("获取属性上指定MyField2类型的注解:");
        for (Field field : fields) {
            MyField2[] myField2s = field.getAnnotationsByType(MyField2.class);
            for (MyField2 myField2 : myField2s) {
                System.out.println(myField2);
            }
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Springboot自定义转换器实现参数去空格功能

    使用Springboot自定义转换器实现参数去空格功能

    这篇文章主要介绍了使用Springboot自定义转换器实现参数去空格功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 使用SpringBoot实现Redis多数据库缓存

    使用SpringBoot实现Redis多数据库缓存

    在我的系统中,为了优化用户行为数据的存储与访问效率,我引入了Redis缓存,并将数据分布在不同的Redis数据库中,通过这种方式,可以减少单一数据库的负载,提高系统的整体性能,所以本文给大家介绍了使用SpringBoot实现Redis多数据库缓存,需要的朋友可以参考下
    2024-06-06
  • SpringCloud Gateway动态转发后端服务实现过程讲解

    SpringCloud Gateway动态转发后端服务实现过程讲解

    这篇文章主要介绍了SpringCloud Gateway动态转发后端服务实现过程,简单的路由转发可以通过SpringCloudGateway的配置文件实现,在一些业务场景种,会需要动态替换路由配置中的后端服务地址,单纯靠配置文件无法满足这种需求
    2023-03-03
  • Java Springboot 重要知识点整理汇总

    Java Springboot 重要知识点整理汇总

    Spring Boot作为微服务中最好的Java框架,本文主要为大家整理汇总了七个Spring Boot的重要知识点,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • SpringBoot中使用异步线程导致Request请求头丢失问题的解决方法

    SpringBoot中使用异步线程导致Request请求头丢失问题的解决方法

    异步线程请求头丢失的问题通常发生在多线程环境中,特别是在使用 CompletableFuture 或其他异步编程模型时,本文给大家详细介绍了SpringBoot中使用异步线程导致Request请求头丢失问题的原因和解决方法,需要的朋友可以参考下
    2025-07-07
  • SpringBoot整合Graylog做日志收集实现过程

    SpringBoot整合Graylog做日志收集实现过程

    这篇文章主要为大家介绍了SpringBoot整合Graylog做日志收集实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • MyBatis实现动态SQL模糊查询的示例代码

    MyBatis实现动态SQL模糊查询的示例代码

    在数据库查询中,模糊查询是最常用的功能之一,今天我们来探讨如何通过动态SQL实现灵活、安全的模糊查询,文中的示例代码讲解详细,有需要的小伙伴可以了解下
    2026-02-02
  • SpringBoot轻松实现ip解析(含源码)

    SpringBoot轻松实现ip解析(含源码)

    IP地址一般以数字形式表示,如192.168.0.1,IP解析是将这个数字IP转换为包含地区、城市、运营商等信息的字符串形式,如“广东省深圳市 电信”,这样更方便人理解和使用,本文给大家介绍了SpringBoot如何轻松实现ip解析,需要的朋友可以参考下
    2023-10-10
  • springboot快速集成mybatis-plus的详细教程

    springboot快速集成mybatis-plus的详细教程

    这篇文章主要介绍了springboot快速集成mybatis-plus的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot集成Swagger使用SpringSecurity控制访问权限问题

    SpringBoot集成Swagger使用SpringSecurity控制访问权限问题

    这篇文章主要介绍了SpringBoot集成Swagger使用SpringSecurity控制访问权限问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论