摘要:中提供了前四个元注解。在中新添加了最后一个注解。指定了注解可以用于的范围。可以默认设置为空字符串如果没有默认值的话,在使用的时候则需要对它进行赋值。反射程序运行时获取注解的值,设置为。可以使用空字符串
分类
元注解(meta-annotation)java元注解就是用来注解其他注解。可以理解为元注解是其他定义的注解的基础。
元注解有 @Retention、@Documented、@Target、@Inherited、@Repeatable 。jdk1.5中 提供了前四个元注解。在jdk1.8中新添加了最后一个注解。
下面我们开始新定义一个注解,对这些元注解加以说明。
首先我们定义一个@GoodMan的注解
@Retention
这个注解是用来解释说明它所注解的注解的存活期。
它的值可以有如下三种
RetentionPolicy.SOURCE:注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS:注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME:注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们
@Documented
在使用javadoc工具生成帮助文档的时候保留其注解信息。也就是引用这个元注解的注解在javadoc文档中会保留自己的注解信息。
@Target
指定了注解可以用于的范围。有以下取值
ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Inherited
继承。如果一个超类引用该注解,则它的子类默认拥有这个超类所具有的的注解
@Repeatable
可以理解为引用了@repeatable的注解可以多次引用同一个注解,多次赋值。
定义注解通过@interface关键字来定义
public @interface GoodMan { }
从某种意义上可以讲注解是一个tag。
这里我们可以理解为在这定义了一个GoodMan的标签。
在这个注解里我们可以定义GoodMan具有什么属性。
应用在GoodMan中
public @interface GoodMan { public String personality(); public String quality() default "selfless"; }
注解只有成员变量(无形参的方法申明),没有方法。上述代码中定义了quality属性,并且为它添加了default默认值"kindness"。默认值不可以为null。可以默认设置为""空字符串
如果没有默认值的话,在使用的时候则需要对它进行赋值。赋值方式是在注解的括号内用value="",多个属性则用逗号隔开。如果只有一个属性,则可以直接在括号内写上value的值,不需要以value=""的形式。
现在一个GoodMan的注解就写好了,这个注解中,我们申明了两个属性:personality和quality。其中给quality一个默认值,所以在接下来我们应用到GoodMan的时候可以不对其进行定义;
@GoodMan(personality = "selfless") public class Ironman { }
在Ironman中我们应用了注解GoodMan并且对未设置默认值的personality赋了selfless的值。
在本次的例子中,可以这样讲GoodMan是一个"标签",我们在Ironman上引用这个"标签",表示Ironman具备GoodMan这个标签下的属性,具备个人品质quality是友好kindness。并且为它定义了personality为selfless。
下面讲一下本人理解的注解执行的过程:
1.通过@interface定义了一个注解,并在里面添加了我们需要的属性
2.在我们需要的地方@注解名(属性值)来引用我们的注解
但是这两个步骤中需要有桥梁,只是单纯的应用这个注解,对于我们的代码没有任何作用。
此时反射和注解处理器就登场了。
反射(Reflect):程序运行时获取注解的值,@Retention设置为RUNTIME。则需要在注解中引用@Retention(RetentionPolicy.RUNTIME)
注解处理器(AbstractProcessor):编译时获取注解的值,@Retention的值为CLASS。则需要在注解中引用@Retention(RetentionPolicy.CLASS)
反射
注解需要定义的有运行时间,作用域。而作用域无论是field,method还是construtor都是有getAnnotation来获取注解的
TIPS
是否包含注解的代码对于java编译器来讲生成的java虚拟机指令是相同的。
注解从某种意义上来讲就是根据所选 处理工具 来识别代码中的注解。
注解是可重复的,如果注解的编写者将其申明为可重复的,则可以多次重复使用一个注解。
注解的默认值不能设置为null,注解元素永远不能为 null。可以使用空字符串"".
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75544.html
摘要:介绍是基于开发的协程开发框架,拥有常驻内存协程异步非阻塞等优点。宇润我在年开发并发布了第一个框架,一直维护使用至今,非常稳定,并且有文档。于是我走上了开发的不归路 showImg(https://segmentfault.com/img/bVbcxQH?w=340&h=160); 介绍 IMI 是基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存、协程异步非阻塞IO等优点。...
摘要:杨充一定时间内该点击事件只能执行一次用来修饰这是一个什么类型的注解。杨充自定义编译器获取遍历,并生成代码配置文件文件配置的作用是向系统注册自定义注解处理器,执行编译时使用进行处理。 目录介绍 01.创建项目步骤 1.1 项目搭建 1.2 项目功能 02.自定义注解 03.创建Processor 04.compiler配置文件 05.编译jar 06.如何使用 07.编译生成代...
摘要:前言最近开发遇到一个问题,两个对象进行属性值拷贝。理论上来说可以直接借助来进行拷贝,奈何两个对象属性名不同,懵逼脸。 1、前言 最近开发遇到一个问题,两个对象进行属性值拷贝。理论上来说可以直接借助org.springframework.beans.BeanUtils.copyProperties(Object source, Object target)来进行拷贝,奈何两个对象属性名不...
摘要:基于注解生成加签验签。是否写入头,建议第一次写入指定,避免中文乱码指定文件编码默认不进行字段排序无待写入的文件列表方法默认值说明必填创建实例,并且指定待读取文件路径。 csv 基于 java 注解生成加签验签 csv。 开源地址: github csv) 创作原由 以前觉得 csv 文件的多写非常简单,就懒得封装。 最近一个月写了两次 csv 文件相关的东西,发现要处理的细节还是有的,...
摘要:创作原由以前觉得文件的读写非常简单,就懒得封装。为了解决上述问题,此框架应运而生。写入文件其中列表构建构建基于注解的测试列表列表你好生成文件内容名称生日你好读取文件测试日志信息你好集合类有时候对象中会包含数组等常见集合。 CSV 基于 java 注解的 csv 读写框架。 相关框架 Apache commons-csv super-csv 简单看了下,这两个框架提供的特性都非常的基础。...
阅读 2179·2021-10-18 13:28
阅读 2483·2021-10-11 10:59
阅读 2313·2019-08-29 15:06
阅读 1110·2019-08-26 13:54
阅读 790·2019-08-26 13:52
阅读 3130·2019-08-26 12:02
阅读 2980·2019-08-26 11:44
阅读 2468·2019-08-26 10:56