通过反射获取注解的属性值(内含源代码)

news2024/11/25 7:45:52

通过反射获取注解的属性值(内含源代码)

源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87554543

目录

  • 通过反射获取注解的属性值(内含源代码)
  • `源代码下载链接地址:`[https://download.csdn.net/download/weixin_46411355/87554543](https://download.csdn.net/download/weixin_46411355/87554543)
  • 1、获取类上注解的值
    • 1.1 定义注解类
    • 1.2 定义使用注解的类
    • 1.3 测试类
    • 1.4 测试结果
  • 2、获取属性变量上注解的值
    • 2.1 定义注解类
    • 2.2 定义使用注解的类
    • 2.3 定义测试类
    • 2.4 测试结果
  • 3、获取方法上注解的值
    • 3.1 定义注解类
    • 3.2 定义使用注解的类
    • 3.3 测试类
    • 3.4 测试效果
  • 4、 获取" 方法参数 " 上注解的值
    • 4.1 定义注解类
    • 4.2 定义使用注解的类
    • 4.3 测试类
  • 总结:

1、获取类上注解的值

1.1 定义注解类

package com.tedu.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Orange {
    String getName();
    String getValue();
}

1.2 定义使用注解的类

package com.tedu.use_anno;

import com.tedu.anno.Orange;

@Orange(getName = "3333",getValue ="4444")
public class ParameterTest {
}

1.3 测试类

package com.tedu.test;

import com.tedu.anno.Orange;
import com.tedu.use_anno.ParameterTest;

public class GetAnnoPropertyAtClass {
    public static void main(String[] args) {
        //通过反射获取类
        Class clazz = ParameterTest.class;
        //判断Orange是否是一个注解
        if(clazz.isAnnotationPresent(Orange.class)){
            //获取类上的注解
            Orange gettedAnnptation = (Orange) clazz.getAnnotation(Orange.class);
            System.out.println("类上的注解获取到第一个:"+gettedAnnptation.getName()+",第二个:"+gettedAnnptation.getValue());
        }
    }
}

1.4 测试结果

在这里插入图片描述

2、获取属性变量上注解的值

2.1 定义注解类

package com.tedu.anno;

import jdk.nashorn.internal.ir.annotations.Reference;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Banana {
    String length();
    String price();
}

2.2 定义使用注解的类

package com.tedu.use_anno;

import com.tedu.anno.Banana;

public class ParameterNameTest {

    @Banana(length = "6666",price="888")
    String something = "other information";
}

2.3 定义测试类

package com.tedu.test;

import com.tedu.anno.Banana;
import com.tedu.use_anno.ParameterNameTest;

import java.lang.reflect.Field;

public class GetAnnoPropertyAtField {
    public static void main(String[] args) {
        //通过反射获取类
        Class clazz = ParameterNameTest.class;
        //获取属性变量上的注解的值
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if(field.isAnnotationPresent(Banana.class)){
                Banana bananaAnnotation = field.getAnnotation(Banana.class);
                System.out.println("属性变量上的注解值获取到第一个:"+bananaAnnotation.length()+
                        "第二个:"+bananaAnnotation.price());
            }
        }
    }
}

2.4 测试结果

在这里插入图片描述

3、获取方法上注解的值

3.1 定义注解类

package com.tedu.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Apple {
    String color();
    String number();
}

3.2 定义使用注解的类

package com.tedu.use_anno;

import com.tedu.anno.Apple;

public class ParameterNameTest {
    @Apple(color = "红色",number = "5555")
    public void method1(){

    }
}

3.3 测试类

package com.tedu.test;

import com.tedu.anno.Apple;
import com.tedu.use_anno.ParameterNameTest;

import java.lang.reflect.Method;

public class GetAnnoPropertyAtMethod {
    public static void main(String[] args) {
        Class clazz = ParameterNameTest.class;
        //获取"方法"上的注解的值
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            if(method.isAnnotationPresent(Apple.class)){
                Apple appleAnnotation = method.getAnnotation(Apple.class);
                System.out.println("方法上的注解值获取到第一个:"+appleAnnotation.color()+",第二个"+appleAnnotation.number());
            }
        }

    }

}

3.4 测试效果

在这里插入图片描述

4、 获取" 方法参数 " 上注解的值

4.1 定义注解类

package com.tedu.anno;

import java.lang.annotation.*;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cherry {
    String value();
}

4.2 定义使用注解的类

package com.tedu.use_anno;

import com.tedu.anno.Cherry;

public class ParameterNameTest {
    public void method2(@Cherry("1111") String param1, @Cherry("2222") String param2){
        System.out.println(param1+param2);
    }
}

4.3 测试类

> package com.tedu.test;

import com.tedu.anno.Cherry;
import com.tedu.use_anno.ParameterNameTest;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;

public class GetAnnoPropertyValueAtMethodParameter {
    public static void main(String[] args) throws NoSuchMethodException {
        Class clazz = ParameterNameTest.class;
        //获取“方法参数”上的注解的值
        Method method = clazz.getDeclaredMethod("method2", String.class, String.class);
        String[] parameterNames = getMethodParameterNamesByAnnotation(method);
        System.out.println("\"方法参数\"上的注解值获取到"+ Arrays.toString(parameterNames));


    }

    /**
     ​
     * 获取给 "方法参数" 注解的值
     ​
     * @param method 要获取参数名的方法
    ​
     * @return 按参数顺序排列的参数名列表
    ​
     */
    public static String[] getMethodParameterNamesByAnnotation(Method method) {
        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
        if (parameterAnnotations == null || parameterAnnotations.length == 0) {
            return null;
        }
        String[] parameterNames = new String[parameterAnnotations.length];
        int i = 0;
        for (Annotation[] parameterAnnotation : parameterAnnotations) {
            for (Annotation annotation : parameterAnnotation) {
                if (annotation instanceof Cherry) {
                    Cherry param = (Cherry) annotation;
                    parameterNames[i++] = param.value();
                }
            }
        }
        return parameterNames;
    }
}

测试效果:

在这里插入图片描述

总结:

主要使用的API是Class类中的实现接口AnnotatedElement的方法

isAnnotationPresent — 检测该元素是否被对应注解修饰

default boolean isAnnotationPresent(Class extends Annotation> annotationClass) { return getAnnotation(annotationClass) != null;

}
getAnnotation --- 获取注解对象

T getAnnotation(Class annotationClass);

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

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

相关文章

做互联网自媒体创业的月薪收入真的能过万吗?

搞自媒体创业有前途吗?收入月薪过万是真的吗? 自媒体创业是一种新兴的创业方法,它的远景十分广阔。自媒体创业能够让人们在自己的兴趣爱好和专业范畴上发挥自己的才能,一起也能够获得不错的收入。可是,月薪过万并不是…

ArangoDB——AQL编辑器

AQL 编辑器 ArangoDB 的查询语言称为 AQL。AQL与关系数据库管理系统 (RDBMS)区别在于其更像一种编程语言,更自然地适合无模式模型,并使查询语言非常强大,同时保持易于读写。数据建模概念 数据库是集合的集合。集合存储记录,称为文…

三维人脸实践:基于Face3D的人脸生成、渲染与三维重建 <三>

face3d: Python tools for processing 3D face git code: https://github.com/yfeng95/face3d paper list: PaperWithCode 基于BFM模型,估计3DMM的参数,可以实现线性的人脸表征,该方法可用于基于关键点的人脸生成、位姿检测以及渲染等。推荐…

信息收集之搜索引擎

Google Hacking 也可以用百度,不过谷歌的搜索引擎更强大 site 功能:搜索指定域名的网页内容,可以用来搜索子域名、跟此域名相关的内容 示例: site:zhihu.com 搜索跟zhihu.com相关的网页“web安全” site:zhihu.com 搜索zhihu…

提升学习 Prompt 总结

NLP现有的四个阶段: 完全有监督机器学习完全有监督深度学习预训练:预训练 -> 微调 -> 预测提示学习:预训练 -> 提示 -> 预测 阶段1,word的本质是特征,即特征的选取、衍生、侧重上的针对性工程。 阶段2&…

C++核心编程

一、内存分区模型概述:C程序在执行时,将内存划分为4个区域程序运行前:代码区:存放函数体的二进制代码,由操作系统管理①共享。共享的目的是对于频繁被执行的程序,在内存中只需有一份代码即可②只读。使其只…

组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比

组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比 目录 组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多输入单输出回归预测对比预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现EMD-KP

传输层协议 TCP UDP

目录 协议前菜 端口号 ​编辑端口号范围划分 认识知名端口号(Well-Know Port Number) netstat pidof 传输层协议 UDP协议 UDP协议端格式 UDP的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 TCP协议 TCP协议概念 TCP协议段格式 标志…

深度分析中国高端投教市场第一股“九方财富”的投资价值

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,九方财富(09636)已于3月10在港交所成功IPO上市,并成为了“中国在线高端投教市场第一股”。 作为中国领先的在线投资决策方案提供商,九方财富…

一起来学习配置Combo接口吧!

Combo接口是一个光电复用的逻辑接口,一个Combo接口对应设备面板上一个GE电接口和一个GE光接口。电接口与其对应的光接口是光电复用关系,两者不能同时工作(当激活其中一个接口时,另一个接口就自动处于禁用状态)&#xf…

常用存储芯片-笔记本上固态硬盘PTS11系列推荐

在存储领域中,除了存储颗粒之外,还有一种极其重要的芯片:存储控制芯片。存储控制芯片是CPU与存储器之间数据交换的中介,决定了存储器最大容量、存取速度等多个重要参数。特别是在AI、5G、自动驾驶时代,对于数据处理及存…

2.HTML页面组成

html页面组成html简介-基础-元素html属性-标题-段落html链接-头部-图像html表格-列表-区块html表单-框架-颜色html字符实体-url前言: 在学习爬虫前,我们还需要了解HTML页面,学习它的组成部分以及各部分的意思和使用方法,代码我放在…

C++回顾(十八)—— 文件操作

18.1 I/O流概念和流类库结构 1 概念 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。 C输入输出包含以下三个方面的内容: (1)对系统指定的标准设备的输入和输出。即从键盘输入数据&am…

前端初学者 sdk 的使用

目录结构: package.json {"name": "ivanfor666","version": "1.0.0","description": "","main": "dist/index.cjs.js","module": "dist/index.esm.js",&quo…

Kafka 分区机制

Kafka 分区机制分区策略轮询策略随机策略按消息键保序策略基于地理位置的分区策略主题 (Topic) :承载真实数据的逻辑容器,主题下还分 n 个分区 Kafka 消息的三级结构: 主题 - 分区 - 消息主题下的每条消息只会保存在某个分区中,…

案例06-复用思想的接口和SQL

目录 一:背景介绍 二:思路&方案 三:过程 1.Controller层接口的复用 2.Mapper层sql语句的复用 四:总结 一:背景介绍 我们在开发项目的过程中非常容易出现的一种现象就是用什么我就直接写什么,就像我…

VPC专有网络介绍

基本概念 VPC:专有网络,云上用户自定义的私有网络。 vSwitch:交换机,组成专有网络的基础网络设备,交换机可以连接不同的云资源,在专有网络内创建云资源时,必须指定云资源所在连接的交换机。 vR…

微服务与分布式——SpringCloud

前提: 当项目逐渐变得庞大起来,简单的 spring 框架可能就不够用了,所以就需要用到分布式架构,我们这里简单介绍一下 springcloud 以及 springcloud 需要依赖的一些组件 目录: 1、分布式简介 2、Eureka 注册中心 3、R…

什么样的人更适合创业?那类人创业更容易成功?

创业是一项充满风险和机遇的事业,成功的创业者需要具备一定的素质和能力。那么,什么样的人更适合创业?哪类人创业更容易成功呢?本文将为您介绍几个适合创业的人群和成功创业者的共同特点。 具有创新精神的人 创业需要不断创新&am…

产品大本营丨计讯物联智慧灯杆网关全系列

在随着智慧城市不断推进,数字信息基础设施已然成为重要驱动。面对新一轮的智慧城市建设,技术赋能结合机制创新,驱动着追城市中生产方式、生活方式、管理方式的变革以及生产要素的配置,全面提升城市的信息化水平。 在新型智慧城市的…