type
status
date
slug
summary
tags
category
icon
password
注解的理解
- jdk 5.0 新增的功能
- Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation,程序员可以在不改变原逻辑的情况下, 在源文件中嵌入一些补充信息。
- 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
框架 = 注解 + 反射机制 + 设计模式
RetentionPolicy
@Retention: 用来表示注解的保留阶段 value的取值是一个 RetentionPolicy类型的枚举
RetentionPolicy一共有三个取值:
- RetentionPolicy.SOURCE: 注解只会保留在源代码阶段,编译成为.class文件以后,注解就消失了 不会影响代码的执行,通常用于代码的校验,比如 @Override @SuppressWarning
- RetentionPolicy.CLASS: 注解会被保留到字节码文件阶段,但是加载 .class文件时,注解就消失了 如果一个注解不指定 RetentionPolicy,默认就是 CLASS级别
- RetentionPolicy.RUNTIME: 注解一直被保留到运行时,运行时通过代码可以读取到注解信息 只有 RetentionPolicy 是 RUNTIME 才能够使用反射读取到
JDK自带注解
- @Override: 重写注解
这个注解写与不写都不会改变程序原有的逻辑,只是用来实现语法的校验,如果一个方法没有正确的重写父类的方法,添加 @Override注解会报错,该注解只保留在源码阶段,就是实现一个编码时的语法校验
- Deprecated: 废弃注解
被这个注解标记的方法,类,成员变量等表示废弃的,不建议使用。如果有一个代码已经废弃了,为什么不直接删除,而是要标记为 deprecated?eg Date里是1.0出现的,1.1开始绝大部分方法都已经废弃了这个注解会保持到运行时
- SuppressWaring
抑制警告注解,代码里如果有警告,都不再提醒(慎用)
deprecation: 抑制 过时警告
unused: 抑制变量未使用的警告
unchecked: 抑制未检查的警告
- @FunctionalInterface
函数式接口用于接口,被这个注解修饰的接口只能有一个抽象方法
SAM: SingleAbstractMethod 用于Lambda表达式
文档注释里的注解
@param: 用来对参数进行说明
@return: 用来对返回值进行说明
@throws / @exception: 用来对方法里的异常进行说明
@see: 参考指定的类、方法等文档
@since: 从哪个版本开始就有了
@deprecated: 从哪个版本开始废弃的
元注解
对现有的注解进行解释说明的注解
- @Retention: 表示的注解的保持策略(在哪儿能生效) RetentionPolicy.SOURCE RetentionPolicy.CLASS RetentionPolicy.RUNTIME
- @Target: 表示注解可以使用的位置(类,方法,成员变量,局部变量,包...)
- @Inherited: 被这个修饰的Annotation接具有继承性
- @Documented: 表示所修饰的注解在被javadoc解析时,保留下来
自定义注解
自定义注解的使用:使用 关键字 @interface 声明一个注解
区分使用 class声明类,使用interface声明接口,使用enum声明枚举
注意如果生命了一个注解以后,不指定@Target,这个注解可以用于所有的位置
JDK8新增注解
- 可重复注解
- 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
- MyAnnotation的Target和Retention等元注解与MyAnnotations相同。
- 类型注解
- ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)
- ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
- 作者:tacjin
- 链接:http://jin.wiki/article/951e7603-1db6-47da-b46b-e1523f816696
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。