定义和反射Annotation类(注解)

文章目录

  • 前言
  • 一、定义Annotation类
  • 二、反射Anootation类
    • 1.元注解
    • 2.反射注解
  • 总结

前言

        在写代码的过程中,我们经常会写到注释,以此来提醒代码中的点。但是,这些注释不会被查看,也不在整个代码之中,只能在源代码中进行查看。如果想要在代码运行后获取这些注释内容,这就用到了Annotation类了,也就是注解。


一、定义Annotation类

        定义Annotation类,需要用到关键字interface,为了区分接口类型,需要在前面加上“@”符号。@interface这个关键字也隐含着继承了java.lang.Annotation接口

        定义Annotation类格式:

public @interface MyAnnotation{//权限修饰符 @interface 注解名称{}
}

        实操展示:

public @interface MyAnnotation{String value() default "";
}

         String为注解内容的类型  value()为自定义名称的注解内容参量 default为设定默认值

二、反射Annotation类

1.元注解

        元注解,即为JAVA的API库中最基础的注解。元注解为我们在自定义创建注解时,对这些自定义注解进行规范,用好这些元注解,才能使我们创建的注解发挥到应有的功能。(在用到元注解的时候,需要添加java.lang.annotation.*包

        以下是部分元注解的说明表格:

部分元注解解读
元注解功能描述
@Decumented指示某一类型的注释通过javadoc和类似默认工具进行文档化
@Inherited指示注释类型被自动继承
@Retention指示注释类型的注释要保留多久
@Taraget指示注释类型所适用的程序元素的种类
@Deprecated在java源码中被@Deprecated修饰的类、方法、变量等表示不建议使用的,可能会出现错误的,可能以后会被删除的类、方法等。标记不想使用的类,方法,变量,可以看作废案。

        在以上表格中,我们想自定义注解,那么用的最频繁的元注解为@Retention(自定义注解会不会在源代码的class文件中,还是乃至扩大到jvm的运行过程)和@Target(自定义注解是给注解、类、接口、枚举、构造方法、成员变量、枚举参数、方法、包等专门地进行注解)。

        以下是@Retention和@Target元注解的介绍,不知下面介绍如何实战,具体使用方法请看实操展示 。

@Retention元注解负责管理自定义注解的注解范围,如果想要反射注解,即获取到注解的信息,必须将@Retention设置为自定义注解在运行代码时加载到JVM中,调用RUNTIME枚举常量

        以下是@Retention元注解中的枚举类RetentionPolicy中的枚举常量:

枚举类RetentionPolicy中的枚举常量
枚举常量说明
SOURCE表示不编译Annotation到class文化中,注解有效范围最小,甚至小于注释,不能反射zhu'j'e
CLASS表示编译Annotation到class文件中,但是在运行时不加载Annotation到JVM中,会导致无法反射注解,不能获取到注解信息
RUNTIME表示在运行时加载Anntation到JVM中,有效范围最大哦,可以反射注解,获取到注解信息

         如果要反射注解,获取到注解信息,我们一定要在自定义注解类上@Retention设置为RUNTIME

使用方法:

@Retention(RentionPolicy.枚举常量);

 

@Target元注解负责管理自定义注解的注解对象, 即该自定义注解是给谁添加注解。

        以下是@Target元注解中的枚举类ElementType中的枚举常量

枚举类ElementType中的枚举常量
枚举常量说明
ANNOTATION_TYPE表示用于Annotation类型
TYPE表示用于类、接口和枚举,以及Annotation类型
CONSTRUCTOR表示用于构造方法
FIELD表示用于成员变量和枚举常量
METHOD表示用于方法
PARAMETER表示用于参数
LOCAL_VARLABLE表示用于局部变量
PACKAGE表示用于包

使用方法:

@Target(ElementType.枚举常量)

(1)以上枚举常量限制自定义注解的注解对象是谁。

(2)在代码中,注解都是放在被注解对象的上一行的。

2.反射注解

        反射注解,即在运行时获取代码注解的信息。要获取注解的信息,提供了以下方法:

反射注解的方法
方法功能描述
isAnnotationPresent(Class annotationClass)查看是否添加了指定的注解,返回布尔值
getAnnotation(Class annotationClass)获得指定的注解
getAnnotations()获得所有的注解的数组

        注意:使用以上方法反射注解的前提是,注解类标记为 @Retention(RentionPolicy.RUNTIME) 即注解加载到JVM

        实操展示:先自定义几个注解,丰富注解内容,然后创建一个Demo类。Demo类中添加构造方法,成员属性,成员变量等,这些内容都要被自定义注解进行注释。最后在main静态方法中使用上述反射注解的方法,实现获取注解信息的功能。

        自定义的成员变量注解:

import java.lang.annotation.*;@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationField {String value() default "默认值";    //说明成员变量的含义boolean enable() default false;    //说明成员变量是否被废除
}

        自定义的构造方法注解:

import java.lang.annotation.*;@Target(ElementType.CONSTRUCTOR)    //注解对象为构造方法
@Retention(RetentionPolicy.RUNTIME)    //添加至运行JVM里
public @interface AnnotationConstructors {String name() default "";    //解释构造方法
}

        自定义的方法注解:

import java.lang.annotation.*;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationMethod{String explain() default "";    //explain参数解释方法是干什么的
}

default关键字 指定参数的默认值。在无人为因素下进行注解,其值都为default默认值 

        Demo类:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class Demo3 {@AnnotationField(value = "姓名")public String name;@Deprecated@AnnotationField(value = "身份号码",enable = true)public int id;@AnnotationConstructors(name = "这个构造方法在解释自己")public Demo3(){System.out.println("这是一个构造方法");}@AnnotationMethod(explain = "这是一个加法运算函数")public int add(int a,int b){return a+b;}public static void main(String[] args) {Demo3 demo3 = new Demo3();Class c = demo3.getClass();Field field[] = c.getDeclaredFields();for(int i=0;i<field.length;i++){if(field[i].isAnnotationPresent(AnnotationField.class)==true){System.out.println("----------------------------------------------");AnnotationField af=field[i].getAnnotation(AnnotationField.class);System.out.println("成员变量:"+field[i].getName()+" 被 @AnnotationField 注解过");System.out.println("注解内容为:"+af.value());System.out.println("该成员变量是否被废除:"+af.enable());}}Constructor constructor;try {constructor = c.getConstructor();if(constructor.isAnnotationPresent(AnnotationConstructors.class)==true){AnnotationConstructors ac=(AnnotationConstructors)constructor.getAnnotation(AnnotationConstructors.class);System.out.println("----------------------------------------------");System.out.println("构造方法"+constructor.getName()+" 被 @AnnotationConstructor 注解过");System.out.println("注解内容为:"+ac.name());}} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}try {Method method = c.getMethod("add",int.class,int.class);AnnotationMethod am = (AnnotationMethod)method.getAnnotation(AnnotationMethod.class);if(method.isAnnotationPresent(AnnotationMethod.class)){System.out.println("----------------------------------------------");System.out.println("方法"+method.getName()+"被 @AnnotationMethod 注解过");System.out.println("注解内容为:"+am.explain());}} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();}}
}

        运行结果:

         如图所示,Demo类中的成员变量、构造方法、方法都被解释了出来,解释清楚这些东西都是什么,便于其他程序员查看理解,注解的使用便利了团队之间的协作,当然注释也能起到这样的效果,只是注解可以直接在控制台中查看。


总结

        以上就是创建自定义注解,使用注解,反射注解要讲的内容,本文仅仅简单介绍了注解的使用,而注解便利了我们团队合作,促进彼此的代码可读性,标注内容避免重复“造轮子”。有补充或者更正的内容,欢迎读者在评论区中留言。

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

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

相关文章

Mistral AI最新力作——Mistral Large媲美GPT-4

Mistral AI自豪地宣布&#xff0c;他们的最新力作——Mistral Large&#xff0c;已经正式面世。这款尖端的文本生成模型不仅在多语言理解上表现出色&#xff0c;更在推理能力上达到了顶级水平。Mistral Large能够处理包括文本理解、转换和代码生成在内的复杂多语言推理任务。 M…

36 - shell之sed

sed grep就是查找文本当中的内容&#xff0c;扩展正则表达式。 一、sed 1.1、sed的定义 sed是一种流编辑器&#xff0c;一次处理一行内容。 如果只是展示&#xff0c;会放在缓冲区&#xff08;模式空间&#xff09;&#xff0c;展示结束&#xff0c;会从模式空间把结果删除…

【LeetCode刷题】6. Z 字形变换

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 6. Z 字形变换 2. 题目描述 3. 解题方法 假设一串字符串"abcdefghijklmnopqrstuvwx", 会有如下排列&#xff1a; 我们再以下标来看看排列 从下标来看&#xff0c;每个下标是有规律的 每一行的下标之间的差…

Java基础 - 练习(五)根据今天日期获取一周内的日期(基姆拉尔森公式)

基姆拉尔森计算公式用于计算一周内的日期。比如给你年月日&#xff0c;从而计算今天是星期几。 基姆拉尔森公式 Week (d2*m3*(m1)/5yy/4-y/100y/4001) mod 7&#xff0c; 3<m<14Week的取值范围是0 ~ 6&#xff0c;其中0代表星期日&#xff0c;1 ~ 6分别代表星期一到星期…

【ai】tx2-nx 开通samba

ubutn服务器加入了samba给jetson也加入一个samba 添加root用户 密码与nvidia一样 添加nvidia 到suoders中并添加samba账号 nvidia@tx2-nx:~$ nvidia@tx2-nx:~$ nvidia@tx2-nx:~$ nvidia@tx2-nx:~$ sudo vi /etc/sudoers nvidia@tx2-nx:~$ sudo chm

【第24章】Vue实战篇之用户信息展示

文章目录 前言一、准备1. 获取用户信息2. 存储用户信息3. 加载用户信息 二、用户信息1.昵称2.头像 三、展示总结 前言 这里我们来展示用户昵称和头像。 一、准备 1. 获取用户信息 export const userInfoService ()>{return request.get(/user/info) }2. 存储用户信息 i…

使用Python selenium爬虫领英数据,并进行AI岗位数据挖掘

随着OpenAI大火&#xff0c;从事AI开发的人趋之若鹜&#xff0c;这次使用Python selenium抓取了领英上几万条岗位薪资数据&#xff0c;并使用Pandas、matplotlib、seaborn等库进行可视化探索分析。 但领英设置了一些反爬措施&#xff0c;对IP进行限制封禁&#xff0c;因此会用到…

每月 GitHub 探索|10 款引领科技趋势的开源项目

1.IT-Tools 仓库名称&#xff1a; CorentinTh/it-tools 截止发稿星数: 16842 (近一个月新增:5744) 仓库语言: Vue 仓库开源协议&#xff1a; GNU General Public License v3.0 引言 CorentinTh/it-tools 是一个开源项目&#xff0c;提供各种对开发者友好的在线工具&#xff0…

【C语言】14.数组指针与函数指针及其应用

一、数组指针 顾名思义&#xff0c;数组指针就是指向数组的指针。形如&#xff1a;int (*p)[10]; 注意&#xff1a;[]的优先级要高于*号的&#xff0c;所以必须加上&#xff08;&#xff09;来保证p先和*结合。 数组指针的使用 int arr[10] {0}; int (*parr)[10] &arr;…

numpy-stl库的基本使用及notebook下的使用

numpy-stl库的基本使用及notebook下的可视化 https://pypi.org/project/numpy-stl/ 安装 conda install -c conda-forge numpy-stl引入资源 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits import mplot3d from stl import mesh读取stl文件 stl_fil…

springboot特殊问题处理2——springboot集成flowable实现工作流程的完整教程(一)

在实际项目开发过程中&#xff0c;流程相关的业务实现采用工作流会异常清晰明了&#xff0c;但是Activity学习成本和开发难度对追求效率的开发工作者来说异常繁琐&#xff0c;但是作为Activity的亲儿子之一的flowable&#xff0c;其轻量化的使用和对应的api会让开发者感受简单&…

超越GPT-4o!新王Claude 3.5 Sonnet来啦!免费使用

目录 01 比GPT-4o更智能&#xff0c;比Claude 3 Opus快两倍 02 最强视觉Model 03 使用Claude的新方式&#xff1a;Artifacts 04 安全性和透明度 Anthropic刚刚发布了全新大模型Claude 3.5 Sonnet&#xff0c;号称是迄今为止最智能的模型。一文几步教你注册使用Claude 3.5 S…

【面试题】风险评估和应急响应的工作流程

风险评估和应急响应是网络安全管理中两个重要的环节。下面分别介绍它们的工作流程&#xff1a; 一、风险评估工作流程&#xff1a; 1.确定评估范围&#xff1a;明确需要评估的信息系统或资产的范围。 2.资产识别&#xff1a;识别并列出所有需要评估的资产&#xff0c;包括硬件…

prometheus+grafana搭建监控系统

1.prometheus服务端安装 1.1下载包 使用wget下载 &#xff08;也可以直接去官网下载包Download | Prometheus&#xff09; wget https://github.com/prometheus/prometheus/releases/download/v2.44.0/prometheus-2.44.0.linux-amd64.tar.gz1.2解压 tar xf prometheus-2.44…

Modbus协议转Profibus协议网关模块连PLC与激光发射器通讯

一、概述 在PLC控制系统中&#xff0c;从站设备通常以Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议等。本文将重点探讨PLC连接Modbus协议转Profibus协…

RGB彩色模型理解与编程实例

一、引言 RGB彩色模型中的R、G和B为三原色&#xff0c;通常R、G和B分别用8位表示&#xff0c;因此24位的RGB 真彩色图像能表示16777216种颜色。在如右图所示RGB彩色立方体可知&#xff0c;任意两种原色混合可以合成一种新的颜色。红&#xff08;1&#xff0c;0&#xff0c;0&a…

微型操作系统内核源码详解系列五(3):cm3下调度的开启

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…

如何使用nginx部署https网站(亲测可行)

公司本来有网站sqlynx.com是http运行的&#xff0c;但因为产品出海&#xff0c;基本上都要求使用https&#xff0c;但又需要兼容已有的http服务&#xff0c;所以我自己尝试做了一次https的部署&#xff0c;目前是正常可用的。 目录 步骤 1&#xff1a;安装 Nginx 步骤 2&…

数据仓库的实际应用示例-广告投放平台为例

数据仓库的数据分层通常包括以下几层&#xff1a; ODS层&#xff1a;存放原始数据&#xff0c;如日志数据和结构化数据。DWD层&#xff1a;进行数据清洗、脱敏、维度退化和格式转换。DWS层&#xff1a;用于宽表聚合值和主题加工。ADS层&#xff1a;面向业务定制的应用数据层。…

node版本过高出现ERR_OSSL_EVP_UNSUPPORTED错误

错误原因&#xff1a; 新版本的nodejs使用的openssl和旧版本不同&#xff0c;导致出错 解决方法&#xff1a; 1.将node版本重新换回16.x 2 windows 下 在package.json文件下添加set NODE_OPTIONS--openssl-legacy-provider && "scripts": {"dev"…