25.自定义注解

news2024/11/17 23:41:39

自定义注解

一、什么是注解

Annontation是Java1.5开始引入的新特征,中文名称叫注解。
它提供了一种安全的类似注释的机制,用来将信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观、更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。
注解和注释很像,注释是我们在开发中,提供给代码使用者或者是其他开发人员用来标注代码含义的功能;注解则是我们在开发中,通过注解向程序中的某个元素提供的相关信息,既是开发者告诉程序元素的内容,又可以作为程序元素为我们提供的相关信息的途径。

二、声明注解

在这里插入图片描述
在这里插入图片描述
注解的内容:

  • 基本数据类型
  • String
  • enum
  • Annotation

以上类型的数组
注解的使用:注解中的属性内容可以存在任意个,根据业务的需求和需要设置的内容,设置不同的属性内容。

  • 属性内容可以通过default设置默认值,如果属性内容存在默认值,在使用注解时可以不为属性内容赋值,但是一旦赋值,则按照新的赋值内容进行处理。
  • 如果只有一个属性内容需要赋值,并且属性内容的名称是value,则value可以省略,直接定义值即可。
  • 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

三、元注解

所有元注解定义在java.lang.annotation包下面,其中Annotation是注解的基本接口,所有的注解都继承这个接口。
java.lang.annotation 提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):

  1. @Documented:指定被标注的注解会包含在javadoc中。
  2. @Retention: 指定注解的生命周期(源码、class文件、运行时)
@Retention(RetentionPolicy.CLASS)//仅class文件可以使用
@Retention(RetentionPolicy.RUNTIME)//运行期可以使用
@Retention(RetentionPolicy.SOURCE)//仅编译期可以使用

3.@Target:指定注解使用的目标范围(类、方法、字段等)

TYPE : 类、接口或enum声明
FIELD:(属性)声明
METHOD: 方法声明
PARAMETER: 参数声明
CONSTRUCTOR: 构造方法声明
LOCAL_VARIABLE:局部变量声明
ANNOTATION_TYPE:注释类型声明
PACKAGE: 包声明

4.@Inherited:指定子类可以继承父类的注解,只能是类上的注解,方法和字段的注解不能继承。即如果父类上的注解是@Inherited修饰的就能被子类继承。

四、注解的应用

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.CONSTRUCTOR})
public @interface MyAnnotation {

	public String name();
	public int val();
	
}

@MyAnnotation(name = "管理员信息", val = 1)
public class Admin {

	@MyAnnotation(name = "管理员姓名", val = 2)
	public String name;
	@MyAnnotation(name = "管理员年龄", val = 3)
	public int age;
	@MyAnnotation(name = "管理员构造方法", val = 4)
	public Admin() {
	}
	@MyAnnotation(name = "管理员自我介绍方法", val = 5)
	public void say() {
		System.out.println("我是管理员");
	}
}

public static void main(String[] args)throws Exception {
		Class c=Admin.class;
		Field f1=c.getDeclaredField("name");
		Field f2=c.getDeclaredField("age");
		
		Constructor con=c.getConstructor();
		
		Method m=c.getDeclaredMethod("say");
		
		MyAnnotation ma0=(MyAnnotation) c.getAnnotation(MyAnnotation.class);
		MyAnnotation ma1=f1.getAnnotation(MyAnnotation.class);
		MyAnnotation ma2=f2.getAnnotation(MyAnnotation.class);
		MyAnnotation ma3=(MyAnnotation) con.getAnnotation(MyAnnotation.class);
		MyAnnotation ma4=m.getAnnotation(MyAnnotation.class);
		
		System.out.println(ma0.name()+"---"+ma0.val());
		System.out.println(ma1.name()+"---"+ma1.val());
		System.out.println(ma2.name()+"---"+ma2.val());
		System.out.println(ma3.name()+"---"+ma3.val());
		System.out.println(ma4.name()+"---"+ma4.val());
	}

在这里插入图片描述

五、通过自定义注解实现接口实现类注入

//声明自定义注解
@Retention(RUNTIME)
@Target(FIELD)
public @interface MyAnn {
	public String val();
}


//不在showview里面实例化
	public static void MyFac() {
		try {
		//获取要执行的类
		Class c=Class.forName("com.woniuxy.crm.view.ShowView");
		//通过属性名获取属性
		Field f=c.getDeclaredField("userService");
		//获取属性的注解
		MyAnn ma=f.getAnnotation(MyAnn.class);
		//根据注解的值进行加载
		Class c1=Class.forName(ma.val());
		//创建类的对象
		Object o=c.newInstance();
		//为注入的属性赋值
		f.set(o, c1.newInstance());
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

//属性通过注解赋值实现无需实例化注入对象
@MyAnn(val="com.woniuxy.crm.service.Impl.UserService")
	public static IUserService userService;

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

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

相关文章

大数据技术之SparkSQL——数据的读取和保存

一、通用的加载和保存方式 SparkSQL提供了通用的保存数据和数据加载的方式。根据不同的参数读取,并保存不同格式的数据。SparkSQL默认读取和保存的文件格式为Parquet。 1.1 加载数据 spark.read.load 是加载数据的通用方式。 如果读取不同格式的数据,可…

如何编译DPDK静态库

阅读前面文章https://blog.csdn.net/qq_36314864/article/details/130243348,知道了哪些dpdk文件可以在windows下生成。 打开vs,新建一个生成静态库工程,在生成的lib文件中找到D:\dpdk-21.07\build\lib D:\dpdk-21.07\build\drivers找到对应的文件,并按照路径,新建筛选项…

【Vue学习笔记7】Vue3中如何开发组件

重点学习:vue3.0之组件通信机制defineProps(组件接收外部传来的参数)、defineEmits(向组件外部传递参数)。 1. 评级组件第一版 简单的评级需求,只需要一行代码就可以实现: "★★★★★☆…

SLAM面试笔记(5) — ROS面试

目录 1 ROS概述 2 ROS通信机制 问题:服务通信概念 问题:服务通信理论模型 3 常见面试题 问题:roslaunch和rosrun区别? 问题:什么是ROS? 问题:ROS中的节点是什么? 问题&…

挠性航天器姿态机动动力学模型及PD鲁棒控制

挠性航天器姿态机动动力学模型及PD鲁棒控制 1挠性航天器姿态机动动力学模型2挠性航天器姿态机动PD鲁棒控制2.1 动力学模型及PD控制律2.2仿真模型2.3 控制程序2.4 被控对象程序2.5 绘图程序2.6 结果 1挠性航天器姿态机动动力学模型 2挠性航天器姿态机动PD鲁棒控制 2.1 动力学模…

【NLP开发】Python实现聊天机器人(ChatterBot,集成web服务)

🍺NLP开发系列相关文章编写如下🍺: 🎈【NLP开发】Python实现词云图🎈🎈【NLP开发】Python实现图片文字识别🎈🎈【NLP开发】Python实现中文、英文分词🎈🎈【N…

澳大利亚兔灾和——栈?

一.背景 1859年,当一位叫托马斯奥斯汀的农民收到英国老家送来的24只野兔并将它们放归农场的时候,他绝对意想不到,这些看似人畜无害的小兔子,竟为古老的澳洲大陆带来一场巨大的生态破坏。到20世纪初,澳大利亚的兔子数量…

操作系统内存管理(上)——内存管理基础

一、内存的基本知识 1.什么是内存?有什么作用? 内存可存放数据。程序执行前先放到内存才能被CPU处理——缓和CPU和硬盘之间的速度矛盾。 给内存的存储单元编址。如果计算机按字节编址,则每个存储单元大小为1字节。即1B8b(8个二进…

智能医院导航导诊系统,门诊地图导航怎么做?

现在很多医院都是综合化大型医院,有很多的科室,院区面积也逐渐扩大,一方面给病患提供了更为全面的医疗资源,另一方面,医院复杂的环境也给病患寻医问诊带来了一定的困扰。电子地图作为大家最喜闻乐见的高效应用形式&…

Python的socket模块及示例

13.2 socket模块 socket由一些对象组成,这些对象提供网络应用程序的跨平台标准。 13.2.1 认识socket模块 socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或应答网络请求,使主机间或一台计算机上的进程间可以通信。sock…

Android 路由框架ARouter源码解析

作者:小马快跑 我们知道在使用ARouter时,需要在build.config里配置: annotationProcessor com.alibaba:arouter-compiler:1.2.2并且知道annotationProcessor用来声明注解解析器,arouter-compiler用来解析ARouter中的各个注解并自…

代码管理记录(一): 码云Gitee代码提交和维护

文章目录 Gitee介绍登录地址代码提交 Gitee介绍 Gitee 是一个类似于GitHub的代码托管平台,是中国的开源社区和开发者社区。它为开发者提供了基于Git的代码托管、协作、部署、代码质量检测、漏洞扫描、容器镜像等服务,同时也提供了一系列的个人资料和社交…

gitlab使用docker简单快速部署

文章目录 前言一、下载gitlab镜像二、安装步骤1.创建docker-compose文件2. 启动及登陆 三、配置页面总结 前言 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。本文主要用来记录如何使用docker快速搭…

c#笔记-类成员

声明类 类可以使用帮助你管理一组相互依赖的数据,来完成某些职责。 类使用class关键字定义,并且必须在所有顶级语句之下。 类的成员只能有声明语句,不能有执行语句。 class Player1 {int Hp;int MaxHp;int Atk;int Def;int Overflow(){if (…

七大排序算法一文通(易懂图解+优化代码)

目录 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 6.1 递归实现——Hoare版 6.2 递归实现——挖坑法 6.3 非递归实现 6.4 优化 7.归并排序 7.1 归并排序——递归实现 7.2 归并排序——非递归实现 8.复杂度以及稳定性 1.直接插入排序 …

一列数到中位数的总距离最小

一列数到中位数的总距离最小 3554.二进制(二进制数的加减法-转化为十进制运算再将结果转回二进制3565.完美矩阵1824.钻石收藏家(经典双指针) 3554.二进制(二进制数的加减法-转化为十进制运算再将结果转回二进制 输入样例&#xff…

i春秋 Misc Web 爆破-1

打开链接是PHP源码 代码审计: include "flag.php"; 表示文件中包含flag.php文件,即根目录下存在flag.php $a $_REQUEST[hello]; 命名一个变量a来接收超全局变量$_REQUEST(接收表单’hello’数据,请求一个为hello的参…

研发效能系列 - 质量与速度能否兼得?

作者:冬哥 引言 我们的时间,应该是用于提高软件质量,还是专注在发布更有价值的功能?这貌似是软件研发中永恒的话题。 到底什么是质量?质量有什么特质? 质量与速度是什么关系,两者是一个硬币的…

spring.factories 的作用是什么

spring.factories 文件用于在 Spring Boot 项目中配置自动配置项。它包含了一系列 key-value 对,key 是自动配置类的全限定名,value 是这些配置类对应的条件类。Spring Boot 会在启动时扫描 classpath 下的 META-INF/spring.factories 文件,并加载其中定义的自动配置类。这些自…

[IAR][CC2642R1] IDE安装和环境搭建,CC2642的环境配置

文章目录 一、IAR安装(1)压缩包下载(2)IAR安装(3) 注册(4) 补丁 二、在IAR中使用CC2642(0)打开IAR,配置环境。(1)例程位置(2)打开例程&#xff08…