Java的自定义注解

news2024/11/20 22:39:24

java元注解和自定义注解的区别

Java的自定义注解是一种元数据,可以应用于类、方法、字段等程序元素上,以提供额外的信息或指示。

        自定义注解包括注解声明、元注解、运行时处理器三个部分。注解声明指定了注解的名称、作用域、成员等信息;元注解则用来对注解进行修饰;运行时处理器则负责在程序运行过程中处理注解,并根据注解提供的信息执行相应的逻辑。自定义注解在编写框架、插件等开发时非常常见,可以为代码提供更多的灵活性和可扩展性

自定义注解类可以通过以下步骤使用:

  1. 定义注解类,指定注解的元素和属性。

  2. 在需要使用注解的地方,使用@注解名称来标注目标元素,可以是类、方法、字段等程序元素。

  3. 可以使用反射机制获取注解,并对注解进行处理。

例如,定义一个自定义注解类:

import java.lang.annotation.*;
/**
 * @Description
 * @Author 刘品水
 * @Data 2023/5/5 18:44
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface MyAnnotation {
    String value() default "";
    int num() default 0;
}

然后在代码中使用该注解:

/**
 * @Description
 * @Author 刘品水
 * @Data 2023/5/5 18:44
 */
@MyAnnotation(value = "Hello 阿水!", num = 1314)
public class MyClass {
    @MyAnnotation("阿水")
    private String name;

    @MyAnnotation(num = 666,value = "闻道有先后,术业有专攻~")
    public void myMethod() {
        // Do something you want to do!
    }

    @MyAnnotation(value = " ")
    public void myMethod2() {
        // Do something you want to do!
    }
}

可以通过反射获取注解并处理:

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Description
 * @Author 刘品水
 * @Data 2023/5/5 18:46
 */
public class MyTest {
    public static void main(String[] args) throws Exception {
        // 获取类上的注解
        MyAnnotation classAnnotation = MyClass.class.getAnnotation(MyAnnotation.class);
        System.out.println("获取类上的注解value值:"+classAnnotation.value()); // 输出:Hello 阿水!
        System.out.println("获取类上的注解num值:"+classAnnotation.num()); // 输出:1314

        // 获取字段上的注解
        Field field = MyClass.class.getDeclaredField("name");
        MyAnnotation fieldAnnotation = field.getAnnotation(MyAnnotation.class);
        System.out.println("获取类上的注解value值:"+fieldAnnotation.value()); // 输出:阿水
        System.out.println("获取类上的注解num值:"+fieldAnnotation.num()); // 输出:0

        // 获取方法上的注解
        Method method = MyClass.class.getDeclaredMethod("myMethod");
        MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);
        System.out.println("获取myMethod方法上的注解value值:"+methodAnnotation.value()); // 输出:闻道有先后,术业有专攻~
        System.out.println("获取myMethod方法上的注解num值:"+methodAnnotation.num()); // 输出:666

        // 获取方法上的注解
        Method method2 = MyClass.class.getDeclaredMethod("myMethod2");
        MyAnnotation methodAnnotation2 = method2.getAnnotation(MyAnnotation.class);
        System.out.println("获取myMethod2方法上的注解value值:"+methodAnnotation2.value()); // 输出:
        System.out.println("获取myMethod2方法上的注解num值:"+methodAnnotation2.num()); // 输出:0

    }
}

注意:自定义注解类必须要有@Retention和@Target元注解,@Retention指定注解的保留策略,@Target指定注解可以应用到哪些元素上。在这里,我们使用RUNTIME保留策略表示注解在运行时仍然有效,并且使用TYPE和METHOD作为注解的目标元素。

Java自定义注解类使用注意事项

        在使用Java自定义注解类时,需要注意以下几点:

  1. 注解元素类型:自定义注解中的元素类型必须是基本数据类型、String、Class、枚举类型或者其他注解类型。

  2. 注解属性默认值和赋值:自定义注解中的属性可以设置默认值,但在使用注解时可以不指定该属性的值。如果需要给属性赋值,则必须按照属性名=属性值的格式进行赋值。

  3. 自定义注解可以使用反射机制来获取和处理,因此要保证注解中的元素符合Java语言规范,不会导致编译错误。

  4. 可以使用元注解@Retention和@Target来指定注解的保留策略和目标范围。一般情况下,@Retention应该设置为RUNTIME,@Target应该根据需要选择适当的目标类型。

  5. 在使用注解时,应该遵循注解的语法规则,即使用 "@" 符号后跟着注解名称,并在括号中指定注解属性和值。如果需要使用多个注解,则可以将它们放在同一个目标元素上,或者使用Java 1.8新增的@Repeatable注解。

        总之,在使用Java自定义注解时,需要遵守Java语法规范和注解的语法规则,注意注解元素类型、属性默认值和赋值、保留策略、目标类型等细节问题,才能保证注解的正确性和有效性。同时也需要理解注解的原理和机制,才能更好地应用自定义注解处理程序逻辑。

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

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

相关文章

IP-GUARD如何通过网络控制策略禁止应用程序联网?

如何通过网络控制策略禁止应用程序联网? 可以在控制台-高级-网络控制中,添加以下策略: 动作:“禁止” 应用程序:填写要禁止的程序(以QQ示例) 如何禁止没有安装客户端的电脑访问客户端电脑? 可以给所有客户端设置只允许客户端电脑访问的网络控制策略; 在控制台左边的…

Unity使用Sqlite3

环境 Unity:Unity2021.3.6f1c1 OS:Window10 64 Plugins:Mono.Data.Sqlite、Sqlite 插件准备 Sqlite3官方网址 Sqlite3有x64和x86版本,根据发布的架构使用不同版本的Sqlite3。 该文档使用x64版本,发布架构为64位。 Mono.Data.Sqlite 使用Unity Hub打开…

搜索旋转排序数组

题目链接 搜索旋转排序数组 题目描述 注意点 nums 中的每个值都 独一无二题目数据保证 nums 在预先未知的某个下标上进行了旋转 解答思路 因为本题数组基本递增(仅在某个位置进行旋转),可以看作由两个递增的数组组合而成,所以…

OPenGL笔记--创建一个3D场景

文章目录 一、前言二、效果展示三、详细流程3.1、World.txt文件规则3.2、加载World.txt3.3、绘制场景3.4、交互 四、详细代码五、举一反三 一、前言 通过前面的学习,基本掌握了怎么绘制图形,使用纹理,接下来就来创建一个3D场景。 基本原理 …

Unity 软性管的实现

概述 因近期项目有要求使用到水管这种软性管的模拟,该篇主要说明软管的实现和应用,参考自:unity3D---实现柔软水管(蛇的移动)效果一(无重力)_unity 软管_ayouayouwei的博客-CSDN博客 效果 实现…

B/S医院手术麻醉管理系统源码:麻醉知情同意书模板

麻醉知情同意书模板 姓名:​ 性别:​ 年龄:​ 科别:​ 床号:​ 住院号:​ 疾病介绍和治疗建议: 医生已告知我因​手术,而接受麻醉。 1.麻醉作用的产生主要是利用麻醉药使中枢神经系统或神经中某些部位受到抑制的结果,临床麻醉的主要任务是: 2.为…

webpack 的打包流程

1.webpack 的打包流程 从以上5个方面来分析Webpack的打包流程: 初始化参数:这一步会从我们配置的webpack.config.js中读取到对应的配置参数和shell命令中传入的参数进行合并得到最终打包配置参数。 开始编译:这一步我们会通过调用webpack()方…

计算机网络基础知识(二)—— 什么是Ip地址、Mac地址、网关、子网掩码、DNS

文章目录 01 | Ip地址02 | Mac地址03 | 网关04 | 子网掩码05 | DNS06 | 总结 初次接触网络时,只知道电脑连接网线,就可以打开4399玩小游戏,可以登录QQ和朋友聊天; 再次接触网络时,知道了怎么查看自己电脑的网络情况&am…

06 - 5 生产者消费者模式

架构演进 介绍 同步调用变成异步调用生产数据与消费数据分离协调不同处理速度 生产者 系统运转的动力为下一个环节产生待处理的工作/数据与消费者的关系 重点在如何将数据发送到容器对消费者无依赖不关注消费者的how/when 发送顺序 消费者 容器 平衡 与EDA对比 消费策略 优点…

我发布了自己第一个由ChatGPT辅助开发的开源项目goattribute

需求产生 前两天在工作过程中又遇到了一直以来困惑我的一个问题,就是Go配置项的管理问题。 在开发一个新项目的时候,往往涉及到配置项的管理。个人小项目可能会通过配置文件来传入、环境变量来传入,也可能通过命令行参数来传入,公…

代码随想录 LeetCode数组篇 长度最小的子数组

文章目录 (中等)209. 长度最小的子数组(中等)904. 水果成篮(困难)76. 最小夫覆盖子串 (中等)209. 长度最小的子数组 我的思路:双指针p和q,滑动窗口的思想 每…

牛客练习赛111 D青蛙兔子的约会

题目链接 示例1 输入 3 3 4 10 1 2 2 4 5 1 1 3 5 11 1 1 输出 YES NO NO 说明 第一问,青蛙晚上向右跳1次,白天无法与兔子相遇。青蛙向右跳2次,也就是2a6的距离,白天兔子向左跳1次,可以相遇。所以在跳[1,2]次中&#…

app持续交付实战

app持续交付实战 一、学习目标二、优势三、子任务拆分四、环境依赖1、安卓 SDK2、安卓设备(真机 or 模拟器)3、Appium 自动化测试4、JDK5、Python3环境6、allure-commandline工具7、allure插件 五、实战任务:串行执行 Jenkins Pipeline 项目1…

Python学习之批量转换图片格式和统一图片尺寸

前言 大家在工作的时候是不是都会接触到很多的图片,为了满足不同的需求: 兼容性:不同设备和应用程序可能支持不同的图片格式。通过转换图片格式,可以确保在各种设备和应用程序中都能够正确地显示图片。 文件大小:不…

基于matlab 从接收脉冲中提取波形参数

一、前言 现代飞机通常随身携带雷达警告接收器 (RWR)。RWR检测到雷达发射,并在雷达信号照射到飞机上时警告飞行员。RWR不仅可以检测雷达发射,还可以分析截获的信号并编目信号来自哪种雷达。此示例显示了 RWR 如何估计截获脉冲的参…

10倍速度开发贪吃蛇游戏之AI辅助

今天就来聊聊AI代码辅助神器,即便是零基础也能上手,因为实在是太强了,这以后叫程序员们怎么活啊!话不多说,直接上神器 我用的是cursor,其实目前AI辅助代码不止cursor,还有微软家的copilot X这个根植于gith…

JVM-01-JVM知识

1-JVM内存模型 Java开发人员一般情况下,使用过程中,不用关注内存的申请和释放,得益于JVM自动内存分配机制,但是其实是个双刃剑,这可以提升Java开发的效率,但是弱化了开发人员内存管理意识,系统容…

四元数快速入门【Quaternion】

四元数(Quaternion)是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述,以帮助理解在空间导航等应用程序中对四元数的需求。 推荐:用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …

U盘在电脑上读不出来怎么办?详细解决方法在这!

案例:u盘在电脑上读不出来 【不知道为什么,我把u盘插入电脑后电脑完全读不出。我也不知道到底哪里出现了问题,有人可以帮我解答一下吗?】 U盘作为我们生活中经常使用的存储工具,其能帮我们存储大量的文件&#xff0c…

BM54-三数之和

题目 给出一个有n个元素的数组S,S中是否有元素a,b,c满足abc0?找出数组S中所有满足条件的三元组。 数据范围:0≤n≤1000,数组中各个元素值满足 ∣val∣≤100。 空间复杂度:O(n^2),时间复杂度 O(n^2)。 注…