如何在Java中使用注解:自定义注解的实现

如何在Java中使用注解:自定义注解的实现

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

Java中的注解(Annotation)是一种代码级别的元数据,可以为程序元素(类、方法、变量等)添加额外的信息。这些信息可以在编译时、类加载时或者运行时被读取和处理。注解在Java框架和库中广泛使用,如Spring、JUnit等。本文将详细介绍如何在Java中使用注解,并实现自定义注解,展示注解的强大功能。

一、注解的基础知识

注解是一种特殊的接口,可以使用@interface关键字定义。注解可以没有成员,也可以包含成员(类似于方法),这些成员可以有默认值。

常见的内置注解包括:

  • @Override:用于方法,表示重写父类方法。
  • @Deprecated:用于表示某个元素已经过时。
  • @SuppressWarnings:用于抑制编译器警告。

二、自定义注解的实现

1. 定义注解

首先,我们在cn.juwatech包下创建一个自定义注解@MyAnnotation。定义注解时可以包含成员变量,成员变量可以有默认值。

package cn.juwatech.annotation;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, ElementType.TYPE}) // 注解可用于类和方法
public @interface MyAnnotation {String value() default "default value";int number() default 0;
}
2. 使用自定义注解

定义好注解后,可以在类或方法上使用它。我们创建一个类TestAnnotation并在其中使用@MyAnnotation注解。

package cn.juwatech.test;import cn.juwatech.annotation.MyAnnotation;@MyAnnotation(value = "Class Annotation", number = 10)
public class TestAnnotation {@MyAnnotation(value = "Method Annotation", number = 5)public void annotatedMethod() {System.out.println("This method is annotated.");}public static void main(String[] args) {TestAnnotation test = new TestAnnotation();test.annotatedMethod();}
}
3. 处理注解

为了处理自定义注解,我们需要使用Java反射机制读取注解信息。创建一个类AnnotationProcessor,用于读取并处理注解。

package cn.juwatech.processor;import cn.juwatech.annotation.MyAnnotation;
import cn.juwatech.test.TestAnnotation;import java.lang.reflect.Method;public class AnnotationProcessor {public static void main(String[] args) {try {// 获取类上的注解Class<TestAnnotation> clazz = TestAnnotation.class;if (clazz.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation classAnnotation = clazz.getAnnotation(MyAnnotation.class);System.out.println("Class annotation: value = " + classAnnotation.value() + ", number = " + classAnnotation.number());}// 获取方法上的注解Method method = clazz.getMethod("annotatedMethod");if (method.isAnnotationPresent(MyAnnotation.class)) {MyAnnotation methodAnnotation = method.getAnnotation(MyAnnotation.class);System.out.println("Method annotation: value = " + methodAnnotation.value() + ", number = " + methodAnnotation.number());}} catch (NoSuchMethodException e) {e.printStackTrace();}}
}

AnnotationProcessor中,我们使用反射获取类和方法上的注解信息,并输出到控制台。运行此代码,输出结果如下:

Class annotation: value = Class Annotation, number = 10
Method annotation: value = Method Annotation, number = 5

三、自定义注解的高级应用

1. 注解参数的高级用法

注解成员可以是所有基本类型、StringClass、枚举类型、注解类型以及它们的一维数组。以下是一个更复杂的注解例子:

package cn.juwatech.annotation;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, ElementType.TYPE})
public @interface AdvancedAnnotation {String name();int[] numbers();Class<?> relatedClass();
}
2. 注解处理工具

在实际项目中,处理注解的过程可能会更加复杂。可以使用一些注解处理工具,如Java Annotation Processing Tool (APT)Spring等框架的注解处理器。

四、注解的实际应用场景

  1. 框架配置:注解可以用于配置框架行为,如Spring中的@Autowired@RequestMapping等。
  2. 代码生成:注解可以用于生成代码或配置文件,如Lombok框架通过注解生成gettersetter等方法。
  3. 数据校验:注解可以用于校验数据,如JSR-303中的@NotNull@Size等。

结论

通过本文的介绍,我们详细了解了如何在Java中使用注解以及如何实现自定义注解。自定义注解不仅可以为我们的代码添加元数据,还能通过反射机制在运行时动态处理这些注解,从而实现更灵活、更可扩展的程序设计。希望大家能在实际项目中灵活运用注解,提高代码的可读性和维护性。

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

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

相关文章

macbook配置adb环境和用adb操作安卓手机

&#xff08;参考&#xff1a;ADB工具包的安装与使用_adb工具箱-CSDN博客&#xff09; 第一步&#xff1a;从Android开发者网站下载Android SDK&#xff08;软件开发工具包&#xff09;。下载地址为&#xff1a; 第二步&#xff1a;解压下载的SDK压缩文件到某个目录中。 进入解…

现在的Android程序员为什么会感到焦虑?焦虑的源头在哪里?该怎么去缓解焦虑呢?——没有无中生有的贩卖焦虑,只有你的挣扎和不甘。

二、知识为何产生焦虑 先说两个世界&#xff0c;知识的世界和现实的世界。 知识的世界&#xff0c;由承载知识的那些载体组成&#xff0c;比如图书、音视频、报刊、自媒体等。 现实的世界&#xff0c;就是我们每天生活的、做出各种行为的世界。 学习的目的是什么呢&#xff1…

[spring] Spring MVC Thymeleaf(下)

[spring] Spring MVC & Thymeleaf&#xff08;下&#xff09; 上篇笔记讲了一下怎么使用 thymeleaf 作为 HTML 模板&#xff0c;与 Spring MVC 进行沟通&#xff0c;这里主要说一下验证的部分 常用表单验证 一些 Spring MVC 内置的常用验证注解如下&#xff1a; Annota…

cuda-将设备的指针拷贝到同一个设备的指针

tensorRT推理时&#xff0c;输入输出指针都位于设备上&#xff0c;所以设备上的指针之间的拷贝需要使用cuda的拷贝指令&#xff0c;不能使用主机的拷贝指令。 float* fusion_model_feature_input1;fusion_model_feature_input1 static_cast<float*>(fusion_model_trt_pt…

项目实战--实现一个多级菜单统一工具类

一、背景介绍 在项目开发工程中&#xff0c;经常需要实现多级菜单的效果&#xff0c;比如需要一个多级功能菜单、多级评论、多级部门等功能&#xff0c;如果每个项目都要定制一版代码或者SQL&#xff0c;就会面临代码重复开发的问题。为简化开发过程并提高代码的可维护性&…

[面试题]MongoDB

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

uniapp运行到模拟器(联想模拟器)

记录一下uniapp项目运行到联想模拟器的流程 先配置一下模拟器端口 填写对应的adb路径&#xff0c;也就是模拟器安装路径下的adb.exe的路径 然后打开模拟器的设置&#xff0c;搜索版本找到版本号&#xff0c;多次点击打开开发者模式 进入开发者选项&#xff0c;打开USB调试 …

Android实战之app版本更新升级全文章(二)

BaseAndroid.checkUpdate(MainActivity.this, 2, “http://f5.market.mi-img.com/download/AppStore/0f4a347f5ce5a7e01315dda1ec35944fa56431d44/luo.footprint.apk”, “更新了XXX\n修复OOO”, false); 看看效果图 界面有点丑&#xff0c;自己修改下吧 当然啦&#xff0c…

Golang | Leetcode Golang题解之第167题两数之和II-输入有序数组

题目&#xff1a; 题解&#xff1a; func twoSum(numbers []int, target int) []int {low, high : 0, len(numbers) - 1for low < high {sum : numbers[low] numbers[high]if sum target {return []int{low 1, high 1}} else if sum < target {low} else {high--}}r…

Ubuntu系统通过GRUB引导菜单进入恢复模式修改账户密码

当在Ubuntu系统中忘记了账户密码时&#xff0c;有几种方法可以破解或重置密码。 本指引文档方法&#xff1a;通过GRUB引导菜单进入恢复模式 实践环境为&#xff1a;20.04.6 LTS (Focal Fossa) 1. 重启Ubuntu系统&#xff1a;首先&#xff0c;你需要重启你的Ubuntu系统。 2. …

Redis 7.x 系列【3】多种连接方式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. Redis Cli3. 可视化管理工具3.1 Redis Insight3.2 RedisDesktopManager 4. …

Python开发——用什么数据储存结构复杂的数据

在Python中&#xff0c;当需要储存包含不同类型的数据时&#xff0c;可以使用以下几种数据结构&#xff1a; 1. 字典&#xff08;dict&#xff09; 字典是一种非常灵活的数据结构&#xff0c;允许使用键-值对来存储不同类型的数据。 data {"name": "Alice&quo…

Windows环境利用 OpenCV 中 CascadeClassifier 分类器识别人眼 c++

Windows环境中配置OpenCV 关于在Windows环境中配置opencv的说明&#xff0c;具体可以参考&#xff1a;VS2022 配置OpenCV开发环境详细教程。 CascadeClassifier 分类器 CascadeClassifier 是 OpenCV 库中的一个类&#xff0c;它用于实现一种快速的物体检测算法&#xff0c;称…

day41--Redis(三)高级篇之最佳实践

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过…

腾讯Hardcoder-Android通讯框架简介

APP 的功能和业务特性不依赖于该框架。 总而言之&#xff0c;由于Hardcoder是腾讯主导的&#xff0c;所以我们不用太担心兼容性问题&#xff0c;腾讯会和手机厂商进行洽谈并提供解决方案&#xff0c;并且目前已经支持Hardcoder框架的手机厂商有OPPO、vivo、华为、小米、三星、…

【C++】————类和对象(中)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月22日 一、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#x…

链接脚本文件入门介绍

本文框架 1. Why<为什么需要链接文件>2.What<是什么及组成>2.1 MEMORY介绍2.2 SECTIONS介绍 3.How<链接文件应用>3.1 定义特定字段3.2 将变量定义在指定段3.3 将变量定义在不同的段3.4 将变量定义在指定地址3.5 将函数定义在指定段3.6 将函数定义在指定地址 …

【PyQt5】python可视化开发:PyQt5介绍,开发环境搭建快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

IDEA 中 Maven 报错 Cannot resolve xxx(全网试完,亲测有效的方法汇总)

问题&#xff1a; pom中已经添加相关依赖&#xff0c;maven刷新也没有用&#xff0c;依旧是疯狂报错。 可能原因&#xff1a; 在IDEA中的pom文件中添加了依赖&#xff0c;并且正确加载了相应依赖&#xff0c;pom文件没有报红&#xff0c;看起来像是把所有依赖库全部加载进来了&…

csp 2023 入门级题解(上)

csp 2023 入门级题解 上 第一题第二题第三题结构体联合体 第四题第五题第六题第7题第八题 第一题 unsigned是指无符号,用于int类型,是指自然数. const是定义常量,定义后的值不可修改. static是将系统栈中的变量放入内存,可以让其他程序调用 答案是c 第二题 答案d 第三题 s…