java注解

Author Avatar
丁起男 07月 07,2020
  • 在其它设备中阅读本文章

java注解

java注解是jdk5.0引入的一种机制

java中的类、方法、变量、参数和包等都可以被标注,和javadoc不同,java注解可以通过反射获取

基本语法

  • 使用@interface关键字表示注解
  • 使用元注解定义注解基本信息
  • 通过类型 属性名() [default 默认值];的格式定义属性
  • 属性类型可以是:
    1. 基本数据类型
    2. string
    3. 枚举
    4. Class
    5. 注解类型
    6. 数组(支持类型的数组)
  • 属性名如果是value,设置属性时可以不指定名称(只设置一个值时)
  • 默认值是可选的,如果不选使用时必须指定

注解本质上是继承了Annotation接口的接口

元注解

元注解的作用就是注解其他的注解

@Target

表示该注解可以用于什么地方

ElemenetType

  • CONSTRUCTOR:构造器
  • FLELD:域
  • LOCAL_VARIABLE:局部变量
  • METHOO:方法
  • PACKAGE:包
  • PARAMETER:参数
  • TYPE:类

@Retention

表示在什么级别保存该注解信息

RetentionPolicy

  • SOURCE:注解将会被编译器丢弃
  • CLASS:注解在class文件中可用,但会被jvm丢弃
  • RUNTIME:jvm将在运行期间也保留注解,可用通过反射读取注解信息

@Documented

将此注解包含在javadoc中,它代表着此注解会被javadoc工具提取成文档

@Inherited

允许子类继承父类的注解

注:这里的继承是指父类类型上的注解

如果是实现父类的抽象方法,则无论如何都不能继承

如果是继承了父类的方法,则无论如何都可以继承

如果是覆盖了父类的方法,则无论如何都不能继承

@Repeatable

java8新增,表示注解可重复标注

容器注解

@Target(ElementType.TYPE)
//声明周期不能短于可重复的注解
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnos {
	//类型为可重复注解的数组
    MyAnno[] value();
}

可重复注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
//表示此注解可重复标注,参数为容器注解
@Repeatable(MyAnnos.class)
public @interface MyAnno {
    String value();
}

jdk自带注解

@Override

检查该方法是否是重写方法

如果发现其父类,或引用的接口中并没有该方法时,会报编译错误

@Deprecated

标记过时方法

调用此方法时,会出现警告

java9中新增:

  • since:指定已注解的api已被弃用的版本
  • forRemoval:表示再将来的既定版本中会被删除,应迁移api

@SuppressWamings

让编译器去忽略注解中声明的警告

常用声明

关键字压制警告类型
all所有
boxing装箱、拆箱时
cast映射相关
dep-ann启用注解
deprecation过期方法
fallthroughswitch中缺失中断
finallyfinally模块没有返回
null忽略null操作
hiding本地隐藏变量
incomplete-switchswitch中缺失条目
nls非nls字符串字面量
rawtypes在类params上使用泛型时,相对于非特异性类型
restriction禁止使用或禁止引用
serial一个序列化的类中,缺失serialVersionUID字段
static-access不正确静态访问相关
synthetic-access内部类的未优化访问
unchecked不受约束的操作
unqualified-field-access与现场访问相关
unused没有使用过代码

@SafeVarargs

忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告

@FunctionalInterface

表示一个匿名函数或函数式接口

@ReservedStackAccess

jdk9(jep270)新增,它会保护被注解方法,通过添加一些额外的空间,防止在多线程运行的时候出现栈溢出

@HotSpotIntrinsicCandidate

jdk9新增,jdk的object类源码中,被@HotSpotIntrinsicCandidate标注的方法,在HostSpot中都要一套高效的实现,该高效实现基于cpu指令,运行时,HotSpot维护的高效实现会代替jdk的源码实现,从而获得更高的效率