java反射和注解2-自定义注解

news2024/9/22 17:31:45

对反射有一定了解过后学习注解就会轻松许多,这篇文章会创建创建字段,方法,参数上面的注解,并且通过反射的形式将注解内容拿出来。

下面是自定义注解的简短讲解

1,自定义注解,创建一个只能修饰方法的注解

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

注解的写法如下,别问我为什么这么写,规定的

用@interface注解的接口

public @interface AnnotationMethod {
    String value();
}

自定义注解必须有这两个参数

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)

@Retention 注解的生命周期,这里一般用RUNTIME:表示在运行时

@Target注解可以修饰的范围:METHOD表示方法,只有METHOD修饰的只能用在方法上,

接下来多创建几个不同的注解

2,创建一个只能修饰字段的注解

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

3,创建一个只能修饰方法参数的注解

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

4,使用注解

public class AnnotationUser {
    @AnnotationField("field")
    public String name;

    @AnnotationMethod("method")
    public void setName(@AnnotationParameter("Parameter") String name) {
    }
}

5,通过代码获取到类class上的所有注解

 public void start() {
        //反射获取类有多少个字段
        Field[] fields = AnnotationUser.class.getFields();
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            //通过字段的getAnnotations()获取到该字段有多少个注解
            for (Annotation annotation : field.getAnnotations()) {
                //判断字段的注解是不是我们自定义的注解
                if (annotation instanceof AnnotationField) {
                    AnnotationField annotationField = (AnnotationField) annotation;
                    //打印字段的名字
                    Log.e("AnnotationTest", "field name: " + field);
                    //打印字段的注解
                    Log.e("AnnotationTest", "field annotation: " + annotationField.value());
                }

            }
        }

        //反射获取类有多少个方法
        Method[] methods = AnnotationUser.class.getMethods();
        for (Method method : methods) {
            //获取每个方法中有多少个注解
            for (Annotation annotation : method.getAnnotations()) {
                //判断方法的注解是不是我们自定义的注解
                if (annotation instanceof AnnotationMethod) {
                    AnnotationMethod data = (AnnotationMethod) annotation;
                    //打印方法名称
                    Log.e("AnnotationTest", "method Name: " + method.getName());
                    //打印注解
                    Log.e("AnnotationTest", "method annotation: " + data.value());
                }
            }
            //获取每个方法有到少个参数
            for (Parameter parameter : method.getParameters()) {
                //获取每个字段上面所有注解
                for (Annotation annotation : parameter.getAnnotations()) {
                    //判断参数的注解是不是我们自定义的注解
                    if (annotation instanceof AnnotationParameter) {
                        AnnotationParameter data = (AnnotationParameter) annotation;
                        //打印参数名称
                        Log.e("AnnotationTest", "Parameter Name: " + parameter.getName());
                        //打印注解
                        Log.e("AnnotationTest", "Parameter annotation: " + data.value());
                    }
                }
            }


        }
    }

6,这样就可以获取到上面的一个class文件上所有的注解了,打印如下

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

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

相关文章

【外汇天眼】概率之道:规则交易背后的心态与风险控制

交易的结果&#xff0c;无外乎盈利和亏损。 对于这些结果&#xff0c;我们的心态管理很重要、很重要&#xff01; 这涉及到“保住江山”和“东山再起”。 先来说说交易盈利的结果 当一个人能够稳定盈利的时候&#xff0c;很容易产生自我麻痹、忘乎所以的飘飘然心态&#xff0…

C++基础 -9- 函数的默认参数

函数默认格式(图片代码段呈现) #include "iostream"using namespace std;void rlxy(int a100) {cout << a << endl; }int main() {rlxy();rlxy(99); }函数默认参数注意事项 函数的默认参数从左开始推导 错误写法 正确写法

一篇学会cron表达式

1、定义 Cron表达式是一种用于定义定时任务的格式化字符串。它被广泛用于Unix、Linux和类Unix系统中&#xff0c;用于在指定的时间执行预定的任务。Cron表达式由6个字段组成&#xff0c;每个字段通过空格分隔开。 在本文中&#xff0c;我们将学习如何理解和编写Cron表达式。 C…

高防服务器和高防CDN的区别是什么?

现今大环境下攻击问题愈发严峻&#xff0c;许多网站有遇到被攻击导致网站崩溃&#xff0c;资源消耗的问题&#xff0c;那么这时候高防就是给为站长&#xff0c;企业等的第一选择了&#xff0c;那边目前高防CDN和高防服务器这两种抵御DDoS攻击的两种主流防御&#xff0c;那种会更…

有趣的代码——猜数字游戏的实现

前面介绍过很多的C语言常识&#xff0c;但是我们都知道“兴趣是最好的老师”&#xff0c;所以&#xff0c;今天我们用之前讲过的一些知识&#xff0c;加上部分新补充的知识点&#xff0c;写一个“猜数字”的小游戏&#xff0c;来丰富我们的编程学习生活&#xff0c;感受来自C语…

win系列:电脑设置关闭屏幕和休眠时间不起作用解决方案

电脑设置关闭屏幕和休眠时间不起作用解决方案 一. 笔记本电脑30s自动锁屏&#xff0c;怎么设置都没用?方法一&#xff1a;使用快捷键方法二&#xff1a;开始菜单设置如果需要对锁屏进行背景等的设置&#xff0c;建议你采用这个方法来进行。方法三&#xff1a;控制面板设置怎么…

高等数学零基础篇复习笔记

预备章 零基础高等数学入门知识 第一节 集合、运算与关系 第二节 三角函数与反三角函数 三角函数的公式 反三角函数 第三节 常见不等式及数列 划重点 第一章 函数、极限与连续 第一节 函数及函数的初等特性 特殊函数 反函数 函数的初等特性 ①有界性 ②奇偶性 偶函数图像…

面向对象基础小结

面向对象基础小结 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同&#xff1a; 面向过程&#xff1a;是把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象&#xff1a;会先抽象出对象&#xff0c;然后用对象执行方法的方…

03 项目运行

前面两篇文章对项目架构+源码架构做了分析,这篇文章先将服务部署一下,能够让大家有个直观的感受。 组件资源 项目运行的各种组件已经为你准备好了,有需要的直接百度云盘下载: 链接:https://pan.baidu.com/s/1hN6qf20gamMHPmA_qXwsLg提取码:o4k9MySQL数据库创建 找到的…

探索数字化转型项目的基础

从消费品到特种化学品&#xff0c;数字化转型正在各行各业中逐渐普及。然而&#xff0c;尽管使用智能化设备、连接解决方案和数据分析对改造升级制造运营模式有巨大帮助&#xff0c;但起步过程&#xff08;奠定一个良好的基础来支撑工厂的可访问性、可靠性、可维护性、可扩展性…

如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控

平时见ORACLE 19c rac single dg的部署很多了&#xff0c;ORACLE em 13c 的安装也很多了,但如何把手工部署的oracle 19c rac dg 添加到em 13c 中去&#xff0c;让EM13C 来实现对RACDG的监控&#xff0c;主要是DG的EM13C的监控&#xff0c;还没有看到&#xff0c;大部分都是直接…

高防CDN可以起到什么作用?

高防CDN相对于普通的CDN加速&#xff0c;除了具备基础的加速功效外&#xff0c;高防CDN在每一节点上均有相应配置的防御功效&#xff0c;不仅具备了隐藏源站不被攻击的优势&#xff0c;也具备了访问加速&#xff0c;多节点防御的功效。随着互联网的不断发展&#xff0c;网络上的…

MOM系统功能清单

什么是MOM系统&#xff1f; MOM系统是制造运营管理&#xff08;Manufacturing Operation Management&#xff09;的缩写。它是指通过协调管理企业的人员、设备、物料和能源等资源&#xff0c;把原材料或零件转化为产品的活动。MOM系统集成了生产计划、库存管理、生产调度、质量…

Haskell 安装 Cairo

背景 Haskell 项目需要使用到柱状图&#xff0c;折线图等&#xff08;demo 代码&#xff09; 步骤&#xff08;默认已安装 stack, cabal, ghcup&#xff09; nameversionstack2.11.1cabal3.8.1.0ghcup0.1.20.0 在 package.yaml 中添加所需依赖 Chart 和 Chart-cairo name:…

Ruoyi-cloud / 若依 SpringCloud服务器部署

1、redis 环境 服务器安装redis &#xff0c;注意 密码 端口 2、mysql 环境 服务器安装 mysql 5.7 以上的版本 代码中的sql 文件夹中有 sql 文件 创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&…

更快更稳的剃须伙伴,DOCO黑刃电动剃须刀体验

现在的电动剃须刀选择很多&#xff0c;我觉得三刀头的旋转式剃须刀很好用&#xff0c;比如我目前用的这款DOCO黑刃剃须刀&#xff0c;在剃须效率、舒适度和易用性等方面都表现不错&#xff0c;很适合日常使用。 这款剃须刀采用磁吸式刀头&#xff0c;这一设计非常方便清洁与更换…

docker容器入门

docker容器入门 1.1 容器介绍 容器技术是一种操作系统级的虚拟化技术&#xff0c;它允许在一个物理或虚拟机上运行多个隔离的应用程序实例&#xff0c;每个实例都被封装在一个独立的容器中。每个容器都包含应用程序及其依赖的运行时环境&#xff0c;如操作系统、库文件和配置…

【代码随想录】算法训练计划35

贪心 1、860. 柠檬水找零 题目&#xff1a; 输入&#xff1a;bills [5,5,5,10,20] 输出&#xff1a;true 思路&#xff1a; 模拟大法 func lemonadeChange(bills []int) bool {//贪心&#xff0c;代码一刷&#xff0c; 感觉要用到hashmap&#xff0c;也不用five, ten : 0…

文件操作在 Python 中的基本用法

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 文件操作是任何编程语言中都至关重要的一部分&#xff0c;Python 提供了简单而强大的文件操作功能&#xff0c;使得读取、写入和处理文件变得非常便捷。本文将详细介绍 Python 中文件操作的基本用法&#xff0c;…

SpringBoot使用动态Banner

SpringBoot使用动态Banner Spring Boot 2.0 提供了很多新特性&#xff0c;其中就有动态 Banner。 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://w…