java自定义注解解析及自定义注解

jdk1.5之后提供了注解(Annotation)这一种语法。其主要作用是编译检查(比如@override)和代码分析(通过代码中添加注解,利用注解解析器对添加了注解的代码进行分析,获取想要的结果,一般自定义的注解都是这一种功能)

一、JDK提供的常用注解(Override、Deprecated、SuppressWarnings)

  • @Override
    表示子类重写了父类的方法,或者实现了接口的方法。帮助开发者确认子类是否正确的覆盖了父类的方法,若父类中没有此方法,编译器即报错。但是,子类与父类有同样的方法,但子类的方法上没有@Override注解,是不会报错。
class MyThread implements Callable<Integer>{//实现callable接口的方法@Overridepublic Integer call() throws Exception {return 200;}
}
  • @Deprecated
    用于提示开发者,标注此注解的方法已经被弃用了。请使用另外推荐的方法
@Deprecatedpublic void call(){System.out.println("expired...");}

在这里插入图片描述

  • @SuppressWarnings
    抑制警告的意思。例如新建一个变量,但是没有用,编译器会提示此变量未使用的警告。如果在方法中,添加了@SuppressWarnings的相关注解,这个警告就不会再提示了。
@SuppressWarnings({"unused"})public static void main(String[] args){List<Integer>list=new ArrayList<>();}

完整架构:
在这里插入图片描述

二、自定义注解

除了java自带的注解,也可以自定义注解,用于帮助为相关代码打上标签,然后我们在解析注解的逻辑中就可以通过这些标签来完成相关的工作,比如,权限控制,日志等。

  1. 语法
1.定义一个自定义注解,与定义一个接口类似,只不过在interface前加是哪个@。
2.其内部可以添加属性值,其属性值的定义为:修饰符 返回值类型 属性名() [default value]其中,修饰符只能用publicabstract。返回值为基本类型、字符串、枚举、注解以及以上类型的一维数组。
3.定义自定义注解,还需要用到元注解,用于修饰自定义注解,
一般我们会用到两个。@Retention@Target

@Retention

//用于确定注解的生命周期。其有三个枚举变量可选
public enum RetentionPolicy {/*** SOURCE级别表示代码级别可见,经过编译器编译生成字节码对象时,此注解就没了。* 比如@override就是代码级别可见*/SOURCE,  /*** CLASS表示字节码对象级别可见,但是字节码对象被虚拟机加载时,* 这个注解会被抛弃,这是默认的可见级别*/CLASS,/*** RUNTIME表示运行时也可见,当虚拟机加载字节码对象时,此注解仍然可见。* 因此可以通过反射获取注解信息,然后完成相应的注解解析工作,一般自定义的注解都是运行时可见。*/RUNTIME
}

@Target

//用于修饰此注解可以用于什么类型上。比如注解可以用在类级别、方法、成员字段或者构造函数上。
public enum ElementType {/** 可以修饰类*/TYPE,  /**可以修饰字段*/FIELD,/** 可以修饰方法*/METHOD,/** Formal parameter declaration */PARAMETER,/** 构造方法*/CONSTRUCTOR,LOCAL_VARIABLE,ANNOTATION_TYPE,PACKAGE,/*** Type parameter declaration** @since 1.8*/TYPE_PARAMETER,/*** Use of a type** @since 1.8*/TYPE_USE
}
  1. 简单的自定义注解例子
@Target({ElementType.METHOD,ElementType.TYPE})//这个注解可以修饰方法和类
@Retention(RetentionPolicy.RUNTIME)//可见范围到运行时都可见。
public @interface LogRecord {/** 下面时候注解的属性 **/  public String operationType() default "";  
}

注意,注解的返回值只能是基本类型、Class、String、enum、Annotation 类型、以上所有类型的数组

  1. 完整的注解自定例子

上述定义的自定义注解,只是一个空的定义,没有任何的意义。因此需要我们自己定义相关的自定义注解的解析。上面提到,自定义的注解需要定义注解的可见范围。一般我们都定义为运行时可见。因此,通过反射,我们可以拿到注解的内容。通过反射拿到代码的注解内容,进行相关的逻辑处理工作,以达到注解的目的。

//通过反射获得注解内容的常用方法有:
T getAnnotation(Class) : 获得当前对象的指定的注解。
Annotation[] getAnnotations() X: 获得当前对象的所有注解
boolean isAnnotationPresent(annotationClass): 当前对象是否有注解。

球队注解:

@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FootBallTeam {public String value() default "Guangzhou Evergrande Taobao Football Club";
}
public class testAnnotation {public static void main(String[] args) {testAnnotation test = new testAnnotation();test.getInformation(Team.class);}public void getInformation(Class<?> clazz) {//因为注解是在成员字段上,因此需要获得类的所有字段信息Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {//判断这个字段上是否有相应的注解信息(FootBallTeam.class)if (field.isAnnotationPresent(FootBallTeam.class)) {FootBallTeam footBallTeam = field.getAnnotation(FootBallTeam.class);System.out.println("球队名字是" + footBallTeam.value());}}}
}
class Team{@FootBallTeam("Real Madrid")private String teamName;
}

在spring中大量应用了注解结合反射机制,实现ioc、aop等功能,更多详解看大佬文章。

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

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

相关文章

自定义注解开发

自定义注解的语法要求&#xff1a; Target({ElementType.METHOD,ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface Description {String desc();String author();int age() default 18; } 首先我们要明确这不是一个接口&#x…

自定义注解(上)自定义注解的定义和检查

什么是注解&#xff1f; 注解是接口的一种变型&#xff0c;定义一组属性&#xff0c;让类、方法或属性用标记的方式调用这些属性。不仅是带有一些属性和值&#xff0c;某些注解带有一些特殊的功能。 如单元测试Test&#xff0c;可以让方法不依赖主函数单独运行&#xff0c;右…

自定义注解详解

文章引用 深入理解Java&#xff1a;注解&#xff08;Annotation&#xff09;自定义注解入门 自定义注解详细介绍 说在最前 文章忽略特性的一些基本概念 注解的本质是反射 1. 自定义注解 注解其实就是一种标记&#xff0c;可以在程序代码中的关键节点&#xff08;类、方法、…

查看 HTTP 请求的数据.

文章结构 如果是 GET 请求如果是 POST 请求方法1&#xff1a;DEBUG 窗口&#xff08;**爽、超级爽、吴迪爽**&#xff09;&#xff1a;方法2&#xff1a;写方法读取流中数据&#xff08;繁琐&#xff0c;难用&#xff09;&#xff1a; 我们可能会碰到 MVC 拿不到前端的参数&…

基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)

在线资料库系统采用.NET开发平台进行开发&#xff0c;开发工具采用Microsoft Visual Studio 2010集成开发环境&#xff0c;后台编程语言采用C#编程语言来进行编程开发&#xff0c;数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息&#xff0c;整个…

【软硬件测试】测试经验:软硬件结合测试要点

目录 一、应用行业 二、测试要点 三、硬件测试 &#xff08;1&#xff09;测试含义 &#xff08;2&#xff09;测试方法 &#xff08;3&#xff09;相关链接 四、结合测试 &#xff08;1&#xff09;测试含义 &#xff08;2&#xff09;测试工具 &#xff08;3&am…

【ros/ros2】LCN及ros2节点的LCN改写

文章目录 序言1. ros2两种节点类型2. LCN是什么3. LCN状态转换4. LCN状态转换要做的事5. LCN节点功能划分6. ros2节点的LCN改写 序言 背景&#xff1a;ros2节点改写为lifecycle node节点 1. ros2两种节点类型 Node&#xff1a;和ros1中一样的节点基类LifecycleNode&#xff…

桶排序 — 计数排序和基数排序

计数排序 int类型数组&#xff0c;其中存的是员工的年龄。比如说16 - 150。对于这样的数据来讲&#xff0c;数据状况是受限的。此时如果将数组从小到大进行排序&#xff0c;该如果实现&#xff1f; 这个实现很简单&#xff0c;实现一个统计数组范围从 0 ~ 150&#xff0c;遍历原…

816墨盒计算机无法与,816墨盒怎么加墨 816墨盒加墨方法及注意问题【详解】

导语&#xff1a;随着时代的快速发展&#xff0c;人们生活水平的不断提高&#xff0c;打印机在我们日常生活中的应用也变得非常广泛&#xff0c;利用打印机打印文件&#xff0c;还有一些重要的材料&#xff0c;方便了人们的生活&#xff0c;给人们的生活提供了很大的便利&#…

打印机 检测到用过的耗材或者赝品耗材

检测到用过的耗材或者赝品耗材 大家好&#xff0c;今天续着给大家分享下惠普的803/805墨盒加墨应该注意的事项&#xff0c;先预习&#xff0c;加墨就没那么多困惑了~ 加墨后打印白线条、溅墨怎么办&#xff1f; ①先用温水浸泡打印头约30秒&#xff08;注意不要泡到芯片&…

打印机墨盒问题

因为打印机墨盒属于耗材&#xff0c;容易损坏&#xff0c;从而造成打印机没法打印。对于家用打印机来说&#xff0c;一个打印机也就三四百块钱&#xff0c;然后换一个新墨盒就得花掉一百左右&#xff0c;心里感觉贼不爽&#xff0c;墨盒那么小一个&#xff0c;居然要那么贵&…

墨盒 连供漏墨恒压问题

你提出了一个连供压力平衡原理的问题。 连供形状各式各样&#xff0c;但基本原理都是相同的。 以红色为例&#xff1a; 如上图。打印机静止时&#xff0c;墨水室的墨水重力&#xff0c;等于墨水室上方因为空气变稀薄后产生的负压。墨水不会流动。实现了压力的静平衡。 打印机工…

【Java 并发编程】深入理解 AQS - AbstractQueuedSynchronizer

深入理解 AQS - AbstractQueuedSynchronizer 1. AQS1.1 什么是 AQS1.2 AQS 具备的特性 2. AQS 原理解析2.1 AQS 原理概述2.1.1 什么是 CLH 锁2.1.2 AQS 中的队列 2.2 AQS 共享资源的方式&#xff1a;独占式和共享式2.2.1 Exclusive&#xff08;独占式&#xff09;2.2.2 Share&a…

JVM学习笔记(中)

1、垃圾回收算法 标记清除法 特点&#xff1a; 速度较快会产生内存碎片 注意&#xff1a;这里的清除并不是真正意义上的清除&#xff0c;即每个字节都清0&#xff0c;而是记录一下被清除的对象的起始和结束的地址&#xff0c;当下一次分配给一个新对象时&#xff0c;新对象…

《Java并发编程实战》课程笔记(四)

互斥锁 原子性问题到底该如何解决呢&#xff1f; “同一时刻只有一个线程执行”这个条件非常重要&#xff0c;我们称之为互斥。如果我们能够保证对共享变量的修改是互斥的&#xff0c;那么&#xff0c;无论是单核 CPU 还是多核 CPU&#xff0c;就都能保证原子性了。 锁模型 …

RK3588平台开发系列讲解(驱动基础篇)设备树常用 of 函数

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查找节点的 of 函数二、获取属性值的 of 函数三、实验示例3.1、查找的节点代码3.2、获取属性内容代码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 设备树描述了设备的详细信息,这些信息包括数字类型的…

chatgpt赋能python:Python中-1的用法介绍

Python中-1的用法介绍 什么是-1&#xff1f; 在Python中&#xff0c;-1是一个特殊的索引值&#xff0c;它表示从序列的末尾开始向前数1个元素。这在对于列表、字符串、元组等序列类型进行操作时非常有用。 如何使用-1&#xff1f; 假设我们有一个列表&#xff1a; l [1, …

SpringBoot框架理解

1 SpringBoot入门 1.2 什么是SpringBoot 1 官网的解释 ​ Spring在官方首页是这么说的&#xff1a;说使用SpringBoot可以构造任何东西&#xff0c;SpringBoot是构造所有基于Spring的应用程序的起点,SpringBoot在于通过最少的配置为你启动程序。 2 我的理解 SpringBoot是Sp…

Flask-RESTful的使用

Flask-RESTful的使用 Flask-RESTful基本使用安装定义资源Resources创建API实例添加资源到API运行Flask应用 请求处理请求解析参数校验 响应处理数据序列化定制返回格式 其他功能蓝图装饰器集合路由命名规范路由名称 Flask-RESTful Flask-RESTful是一个用于构建RESTful API的扩展…

计算机对社会的应用是什么,电子计算对人类社会有什么贡献?应用的领域又有哪些?...

在人类历史上&#xff0c;蒸汽机的发明和电力的使用&#xff0c;曾经在生产技术上引起过划时代的工业革命&#xff0c;然而&#xff0c;这种革命&#xff0c;从本质上来讲&#xff0c;它仅仅是涉及到代替人的体力劳动&#xff0c;但电子计算机的发明&#xff0c;已经涉及到代替…