美文网首页
annotation

annotation

作者: YDDMAX_Y | 来源:发表于2020-02-23 11:27 被阅读0次

1. 注解的用处

  1. 标记作用,给读者提供一些信息
  2. 为编译器提供信息:可以被编译器用于错误检查和抑制警告
  3. 编译和部署时进行处理:通过注解信息生成代码、配置文件等
  4. 运行时进行处理:一些注解信息可以保留到运行时,通过反射进行获取

2. 注解处理

  1. 编译期间
    编译时指定注解处理器,可以自动生成代码和配置文件。参考Java注解处理器
  2. 运行时
    在运行时通过反射动态获取注解信息

3. 元注解

3.1 @Retention:注解的保留位置

@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

3.2 @Target:注解的作用目标

  1. @Target(ElementType.TYPE) //接口、类、枚举、注解
  2. @Target(ElementType.FIELD) //字段、枚举的常量
  3. @Target(ElementType.METHOD) //方法
  4. @Target(ElementType.PARAMETER) //方法参数
  5. @Target(ElementType.CONSTRUCTOR) //构造函数
  6. @Target(ElementType.LOCAL_VARIABLE)//局部变量

Local variable annotations are not retained in class files (or at runtime) regardless of the retention policy set on the annotation type. See JLS 9.6.1.2.

  1. @Target(ElementType.ANNOTATION_TYPE)//注解
  2. `@Target(ElementType.PACKAGE) ///包
  3. ElementType.TYPE_PARAMETER
    泛型参数
  4. ElementType.TYPE_USE
    以用于标注任意类型(不包括class)
    类型注解用来支持在Java的程序中做强类型检查,配合第三方插件工具(如Checker Framework),可以在编译期检测出runtime error(如UnsupportedOperationException、NullPointerException异常),避免异常延续到运行期才发现,从而提高代码质量,这就是类型注解的主要作用。
//TYPE_PARAMETER 标注在类型参数上
class D<@Parameter T> { }

//TYPE_USE则可以用于标注任意类型(不包括class)
//用于父类或者接口
class Image implements @Rectangular Shape { }

//用于构造函数
new @Path String("/usr/bin")

//用于强制转换和instanceof检查,注意这些注解中用于外部工具,它们不会对类型转换或者instanceof的检查行为带来任何影响。
String path=(@Path String)input;
if(input instanceof @Path String)

//用于指定异常
public Person read() throws @Localized IOException.

//用于通配符绑定
List<@ReadOnly ? extends Person>
List<? extends @ReadOnly Person>

@NotNull String.class //非法,不能标注class
import java.lang.@NotNull String //非法,不能标注import

3.3 @Inherited

  1. 类继承关系中@Inherited的作用
    类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解
  2. 接口继承关系中@Inherited的作用
    接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰
  3. 类实现接口关系中@Inherited的作用
    类实现接口时不会继承任何接口中定义的注解

3.4 @Repeatable

自 Java 8 开始引入,表明注解可以在一个元素上重复使用。

//使用Java8新增@Repeatable原注解
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(FilterPaths.class)//参数指明接收的注解class
public @interface FilterPath {
    String  value();
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface FilterPaths {
    FilterPath[] value();
}

//使用案例
@FilterPath("/web/update")
@FilterPath("/web/add")
@FilterPath("/web/delete")
class AA{ }

我们可以简单理解为通过使用@Repeatable后,将使用@FilterPaths注解作为接收同一个类型上重复注解的容器,而每个@FilterPath则负责保存指定的路径串。

3.5 @Documented

表明注解在被应用于元素时,这些元素应该使用 Javadoc 生成文档。默认不使用。

4. 其他内置注解

4.1 @Deprecated

4.2 @Override

4.4 @SuppressWarnings

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

数组的接收值为

deprecation:使用了不赞成使用的类或方法时的警告;
unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 
fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
path:在类路径、源文件路径等中有不存在的路径时的警告; 
serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告; 
finally:任何 finally 子句不能正常完成时的警告; 
all:关于以上所有情况的警告。

4.4 @SafeVarargs

Java 7 开始引入的。当应用于方法或构造方法中时,假定代码不会在可变参数 (varargs ) 中执行不安全的操作。使用这个注解时,和可变参数相关的 unchecked 警告会被抑制。

4.5 @FunctionalInterface

5. 注解数据类型

  1. 所有基本类型(int,float,boolean,byte,double,char,long,short)
  2. String
  3. Class
  4. enum
  5. Annotation
  6. 上述类型的数组

6. 参考

深入理解Java注解类型Annotation

相关文章

网友评论

      本文标题:annotation

      本文链接:https://www.haomeiwen.com/subject/fwodqhtx.html