【Java基础-注解】Java中注解的分类有哪些,如何自定义一个注解,并使用举例

在Java中,注解(Annotation)是一种元数据(metadata)的形式,用于为Java代码(类、方法、变量、参数、包等)提供信息。注解不会直接影响代码的执行,但可以被编译器用来生成代码、在编译时进行格式检查或者由其他工具在运行时进行解析和使用。

注解的分类

Java中的注解可以分为三种类型:

  1. 标记注解(Marker Annotations):没有成员定义的注解,例如@Override。它仅用于标识某种情况或标记某种属性。

  2. 单值注解(Single Value Annotations):只有一个元素的注解,例如@Deprecated("不建议使用的原因")。这种注解虽然只有一个元素,但可以通过value()方法名来省略元素名。

  3. 完整注解(Full Annotations):包含多个元素的注解,例如@Retention@Target。这种注解可以包含多个元素,并且每个元素都有一个名字。

如何自定义一个注解

自定义一个注解需要使用@interface关键字,而不是interface。下面是一个简单的自定义注解的例子:

import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  // 自定义一个注解  
@Retention(RetentionPolicy.RUNTIME) // 注解的生命周期  
@Target(ElementType.METHOD) // 注解可以应用的Java元素类型  
public @interface MyAnnotation {  // 定义注解的元素  String value() default ""; // 定义一个名为value的元素,类型为String,默认值为""  int order() default 0; // 定义一个名为order的元素,类型为int,默认值为0  
}
使用注解的举例

在定义好注解之后,你可以在其他Java代码中使用这个注解。下面是一个使用MyAnnotation注解的例子:

public class MyClass {  // 使用自定义注解  @MyAnnotation(value = "这是一个例子", order = 1)  public void myMethod() {  // 方法体  }  // 另一个使用注解的例子,只使用了value元素,order使用了默认值  @MyAnnotation("另一个例子")  public void anotherMethod() {  // 方法体  }  
}
解析和处理注解

要在运行时解析和处理注解,你需要使用反射(Reflection)。Java的java.lang.reflect包提供了读取和处理注解的工具。下面是一个简单的例子,展示如何使用反射来读取MyClassmyMethod方法的MyAnnotation注解:

import java.lang.reflect.Method;  public class AnnotationProcessor {  public static void main(String[] args) throws NoSuchMethodException {  Class<?> clazz = MyClass.class;  Method method = clazz.getMethod("myMethod");  if (method.isAnnotationPresent(MyAnnotation.class)) {  MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);  System.out.println("Value: " + annotation.value());  System.out.println("Order: " + annotation.order());  }  }  
}

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

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

相关文章

APP上架 篇四:计算机软件著作权证书和APP电子版权证书

文章目录 系列文章概念《计算机软件著作权证书》和《软件著作权认证证书》《APP电子版权证书》和《软件著作权认证证书》申请《计算机软件著作权证书》中国版权保护中心的官方网站申请流程费用详情软件更新后续维护申请《软件著作权认证证书》和《APP电子版权证书》“易版权”官…

创建__init__()方法

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在创建类后&#xff0c;可以手动创建一个__init__()方法。该方法是一个特殊的方法&#xff0c;类似Java语言中的构造方法。每当创建一个类的新实例时…

【AI界的狼人杀】人工智能“反图灵测试”实验

5月28日&#xff0c; AI Power Users、Unity 独立开发者&#xff1a;Tore Knabe 在其社交平台发布了一则名为《Reverse Turing Test Experiment with AIs》的视频&#xff0c;立马引发了热议。 视频中共出现了五位主要角色&#xff0c;“他们”分别是&#xff1a;亚里士多德&am…

961操作系统知识总结

部分图片可能无法显示&#xff0c;参考这里&#xff1a;https://zhuanlan.zhihu.com/p/701247894 961操作系统知识总结 一 操作系统概述 1. 操作系统的基本概念 重要操作系统类型&#xff1a;批处理操作系统(批量处理作业&#xff0c;单道批处理/多道批处理系统&#xff0c;用…

RabbitMQ-直连交换机(direct)使用方法

RabbitMQ-默认读、写方式介绍 RabbitMQ-发布/订阅模式 目录 1、概述 2、直连交换机 3、多重绑定 4、具体代码实现 4.1 生产者部分 4.2 消费者部分 5、运行代码 6、总结 1、概述 直连交换机&#xff0c;可以实现类似路由的功能&#xff0c;消息从交换机发送到哪个队列…

夜天之书 #98 Rust 程序库生态合作的例子

近期主要时间都在适应产品市场&#xff08;Product Marketing&#xff09;的新角色&#xff0c;不少想法还在酝酿和斟酌当中&#xff0c;于是文章输出没有太多时间来推敲和选题&#xff0c;只能保持每月发布相关的进展或一些零碎的思考。或许我可以恢复最早的模式&#xff0c;多…

C#面:说出尽可能多的基于.Net Framework的语言

C#、VB.Net、F#、PowerShell、IronPython、J#、Ruby.Net C#是一种基于.Net Framework的编程语言&#xff0c;是微软公司开发的一种通型、面向对象的编程语言。C#可以用于开发种类型的应用程序&#xff0c;包括桌面应用程序、Web应用程序、移动应用程序和游戏等。 除了C#之外&…

YOLOv8改进(一)-- 轻量化模型ShuffleNetV2

文章目录 1、前言2、ShuffleNetV2代码实现2.1、创建ShuffleNet类2.2、修改tasks.py2.3、创建shufflenetv2.yaml文件2.4、跑通示例 3、碰到的问题4、目标检测系列文章 1、前言 移动端设备也需要既准确又快的小模型。为了满足这些需求&#xff0c;一些轻量级的CNN网络如MobileNe…

如何进入docker容器中

要进入正在运行的Docker容器&#xff0c;您可以使用docker exec命令。这里是一个基本的命令示例&#xff1a; docker exec -it <container_id_or_name> /bin/bash这里的-it参数是为了让我们能交互式地使用容器的shell。<container_id_or_name>是您想要进入的容器的…

十_信号4-SIGCHLD信号

SIGCHLD信号 在学习进程控制的时候&#xff0c;使用wait和waitpid系统调用何以回收僵尸进程&#xff0c;父进程可以阻塞等待&#xff0c;也可以非阻塞等待&#xff0c;采用轮询的方式不停查询子进程是否退出。 采用阻塞式等待&#xff0c;父进程就被阻塞了&#xff0c;什么都干…

力扣83. 删除排序链表中的重复元素

Problem: 83. 删除排序链表中的重复元素 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义快慢指针fast、slow均指向head&#xff1b; 2.每次fast后移一位&#xff0c;当fast和slow指向的节点值不一样时&#xff0c;将slow.next指向fast同时使slow指向fast&#xff1b; 3…

MyBatis框架-开发方式+参数传递+#{}、${}+返回值处理+查询结果封装为对象+resultType

一、开发方式 MyBatis-Dao层Mapper接口化开发 二、注意事项 1、Mapper接口与Mapper.xml映射文件要满足4个对应 &#xff08;1&#xff09;Mapper接口的全类名必须与Mapper映射文件中的namespace相同 &#xff08;2&#xff09;Mapper接口中的每一个方法名在Mapper映射文件…

创建对象和继承的多种方式

1. 创建对象的多种方式&优缺点 1.1 工厂模式 function createPerson(name) {var o new Object();o.name name;o.getName function () {console.log(this.name);};return o; }var person1 createPerson(kevin);优点&#xff1a;简单&#xff1b; 缺点&#xff1a;对象…

Linux C/C++ 系统错误

在C中&#xff0c;如果调用了库函数&#xff0c;可以通过函数的返回值判断调用是否成功。其实还有一个整型的全局变量errno&#xff0c;存放了函数调用过程中产生的错误代码。 如果调用库函数失败&#xff0c;可以通过errno的值来查找原因 #include <errno.h>strerror(…

密码学——银行应用程序安全:理解和解决关键安全问题

1. 认证和访问控制 1.1 用户认证 银行应用程序通过Web服务器让客户访问其银行账户的操作历史。用户首先通过用户名和密码进行认证&#xff0c;然后才能查看其账户历史。这个过程涉及基本的认证和访问控制机制&#xff0c;确保只有合法用户可以访问其个人信息。 2. 安全执行环境…

时序数据库介绍及应用场景,C#实例

一&#xff0c;时序数据库介绍 时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;是一种专门用于存储、处理和查询时间序列数据的数据库系统。以下是关于时序数据库的详细解释&#xff1a; 定义 时序数据库是一种优化用于摄取、处理和存储时间戳数据的…

回溯算法之电话号码字母组合

题目&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "2…

【MySQL】探索 MySQL 窗口函数(Window Functions)

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 在大数据分…

Java web应用性能分析之【jvisualvm远程连接云服务器】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 前面整理了java进程问题分析和分析工具&#xff0c;现在可以详细看看jvisualvm的使用&#xff0c;一般java进程都是部署云服务器&#xff0c;或者托管IDC机…

【MySQL】探索 MySQL 中的 CASE WHEN 表达式

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 在数据库查…