Java Annotation 注释类的 Retention 和重复注释

注释(@annotation):

metadata 元数据格式,提供信息给编译器,oracle 文档讲解怎么在编程中高效地使用注释类;
简述:注释是元数据,提供描述程序的数据,并不是程序本身的一部分;被注释的代码,在操作上并不会有什么区别;注意:注释类的参数的形式是:方法;并不是字段,在编译器运行时,应该重载并调用该方法,该方法会返回一个在注释时,写进入的值,如:@Schedules(dayOfMonth="last")
用途
① 给编译器提供信息;注释可以被编译器使用,去探查 errors 和 SuppressWarnings;
② 编译期和部署期加工:一些软件工具可以处理加工注释信息,生成代码或者xml文件等;
③ 运行期加工处理:可以在运行期检查一些注释,如springboot的那些注释吧;
所在包:一般在 java.lang | java.lang.annotation
用的地点:类、字段、方法、程序其他元素的声明:

  • Class instance creation expression: new @Interned MyObject();
  • Type cast: myString = (@NonNull String) str;
  • implements clause: class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }
  • Thrown exception declaration: void monitorTemperature() throws @Critical TemperatureException { ... }

简单格式:@Entityclass user{...}
注释的元素:注释可以包含 elements,可以在注释时,输入值:@SuppressWarnings(value="unchecked");
并且当注释只有一个 String 类型的元素时,可以省略 value,如下:@SuppressWarnings("unchecked")


重复注释(Java8支持):@Author(name = "Jane Doe")@Author(name = "John Smith")class MyClass { ... }
创建一个注释:格式:@interface name{}
注释的提取
使用Class myC=Class.forName("qualifiedName") 获取一个类;(只适合获取1个类,想要获取一个目录下的所有类,应该要后面的知识了);
myC.isAnnotationPresent(CustomAnnotation.class); 通过该函数判断指定 Annotation 是否出现在该类上(只适用于 Target 为 Type 的);
如果有这个注释,则使用:CustomAnnotation ca = (CustomAnnotation)myC.getAnnotation(CustomAnnotation.class);
注意:该方法返回值是 <? extends Annotation>,所以需要强制转换 cast;
同时在这一步也可以对类中方法 method 进行判断:Method[] ms = myC.getMethods(); 其方法与类上注释判断类似,后不详述;
获取注释的元素值:ca.value() 等等;方法已经在注释的代码体中写出;
注意:能够使用上述方法查到的注释类,其应该要保留到运行时,即必须显式写上 @Retention(RetentionPolicy.RUNTIME) 才可以(因为@Retention隐式为保留到编译时),否则该注释不会被 JVM 加载到内存中,无法使用反射,经过实例测试,确实如此;
通过这个,就可以知道 springboot 应该就是对 SpringApplication 类所在的目录下,所有包中的所有类进行扫描,判断是否有 @Component 等注释,如果有,则使用 Class.forName() 生成该类,并注入到容器中;


部分Java预定义的注释:

@Deprecated :表示被注释的元素是弃用的,应该不要使用;当在程序中使用了被@Deprecated 注释的类、字段、方法时,编译器会打印警告;
@Override:提示编译器该方法会重载父类的方法;@SuppressWarnings("{...}"):使用这个可以抑制2种类型的警告:"deprecatation"、"unchecked";
@SafeVarargs:当应用到方法或构造器上,会断言代码在可变参数上没有执行潜在的危险操作;当使用该注释时,与varargs相关的unchecked警告将会被抑制 suppress;
@FunctionalInterface:指示一个类型是函数式接口形式,用于函数式编程中;
@Native:用在字段-常量上,指示一个字段可能援引自 native 代码,即 C\C++;应用到其他注释的注释:被称为 meta-annotations,元注释;下面是几个


java.lang.annotation 里面的几个元注释:

@Retention(保持、保留、注意力):隐式默认为编译时;指示一个注释要保留到什么时候:RetentionPolicy.SOURCE-仅到源码时、RetentionPolicy.CLASS-仅保存到编译时、RetentionPolicy.RUNTIME-一直保存到运行时
说明:如果没有使用 @Retention@Document:被其注释的注释,只要被使用,该注释的元素就会被 Javadoc 工具记录成文本;(默认情况下,注释没有被 javadoc 工具包含)
@Target:严格指定一个注释可以用在哪种Java元素上,有如下Java元素:ElementType.ANNOTATIONTYPE(后面用x代表ElementType)、x.TYPE、x.CONSTRUCTOR、x.FIELD、x.METHOD、x.LOCAL_VARIABLE、x.PACKAGE、x.PARAMETER
@Inherited:被这个注解注释的注解,当其用在一个类 A 时,在 A 的子类 B 上查询一个注释,若 B 查询不到该注释,会前往 A 的注释上去查询;具体用处需要深入了解;
@Repeatable:指示一个注释,其标记注解一个类或声明时,可以出现多次;


类型检查:JavaSE8 没有提供内嵌的类型检查注释类型,但spring有,好像在SpringUtil里面,包含Springboot判空、判类型的那些注释
重复注释 RepeatAnnotation:JavaSE8后,允许重复注释,有时候重复注释会有用,如:@Schedule(dayOfMonth="last")@Schedule(dayOfWeek="Fri",hour="23")void invokeAtIndicatedTime(){...}上面的方法将会在每月的最后一天、每周5的23点进行调用;重复注释不仅用于方法上,还可以在任何允许注释的地方使用重复注释;说明:在一个注释类未声明重复之前,重复使用它会造成编译期间错误;注释类型设计:注释类型设计时,应该仔细考虑很多东西:是否可重复注释?可以注释哪些位置:类?字段?方法?以及注释要保留到什么时候?


创建一个可重复注释的注释类:

① 声明一个可重复注释类型:import java.lang.annotation.Repeatable;@Repeatable(Schedules.class)@interface Schedule{ String dayOfMonth() default "first"; String dayOfWeek() default "Mon"; int hour() default "";}注:上述 Schedules.class 没有写错,并不是 Schedule ,Schedules 也是一个注释类,其内部有一个返回 Schedule 数组的方法;存储注释类:编译器会存储可重复注释类到@Repeatable()括号中的注释类;可以说这个类 Schedules 是容器,包含了 Schedule 数组;
② 声明Repeatable注释类的容器类:@interface Schedules{ Scedule[] value();}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容