java注解
java注解是jdk5.0引入的一种机制
java中的类、方法、变量、参数和包等都可以被标注,和javadoc不同,java注解可以通过反射获取
基本语法
- 使用@interface关键字表示注解
- 使用元注解定义注解基本信息
- 通过
类型 属性名() [default 默认值];
的格式定义属性 - 属性类型可以是:
- 基本数据类型
- string
- 枚举
- Class
- 注解类型
- 数组(支持类型的数组)
- 属性名如果是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 | 过期方法 |
fallthrough | switch中缺失中断 |
finally | finally模块没有返回 |
null | 忽略null操作 |
hiding | 本地隐藏变量 |
incomplete-switch | switch中缺失条目 |
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的源码实现,从而获得更高的效率