文章目录
- java注解
- 1.简介
- 2. 内置注解
- 3. 元注解
- 4.自定义注解
- 4.1 注解架构
- 4.2 定义格式
java注解
1.简介
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和注释不同,Java 标注可以通过反射获取标
注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行
时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
主要用于:编译格式检查、反射中解析、生成帮助文档、跟踪代码依赖等
2. 内置注解
@Override
: 重写
- 定义在java.lang.Override
@Deprecated
:废弃
- 定义在java.lang.Deprecated
@SafeVarargs
- Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterface
: 函数式接口
- Java 8 开始支持,标识一个匿名函数或函数式接口。
@Repeatable
:标识某注解可以在同一个声明上使用多次- Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
SuppressWarnings()
抑制编译时的警告信息。
- 定义在java.lang.SuppressWarnings
- 三种使用方式
-
@SuppressWarnings("unchecked")
: 抑制单类型的警告 -
@SuppressWarnings("unchecked","rawtypes")
:抑制多类型的警告 -
@SuppressWarnings("all")
:抑制所有类型的警告
- 参数列表:
关键字 | 用途 |
all | 抑制所有警告 |
boxing | 抑制装箱、拆箱操作时候的警告 |
cast | 抑制映射相关的警告 |
dep-ann | 抑制启用注释的警告 |
deprecation | 抑制过期方法警告 |
fallthrough | 抑制确在switch中缺失breaks的警告 |
finally | 抑制finally模块没有返回的警告 |
hiding | 抑制相对于隐藏变量的局部变量的警告 |
incomplete-switch | 忽略没有完整的switch语句 |
nls | 忽略非nls格式的字符 |
null | 忽略对null的操作 |
rawtypes | 使用generics时忽略没有指定相应的类型 |
restriction | 抑制禁止使用劝阻或禁止引用的警告 |
serial | 忽略在serializable类中没有声明serialVersionUID变量 |
static-access | 抑制不正确的静态访问方式警告 |
synthetic-access | 抑制子类没有按最优方法访问内部类的警告 |
unchecked | 抑制没有进行类型检查操作的警告 |
unqualified-field-access | 抑制没有权限访问的域的警告 |
unused | 抑制没被使用过的代码的警告 |
3. 元注解
元注解就是作用在其他注解的注解。有下面几种:
@Retention
- 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。@Documented
- 标记这些注解是否包含在用户文档中。@Target
- 标记这个注解应该是哪种 Java 成员。@Inherited
- 标记这个注解是自动继承的
- 子类会继承父类使用的注解中被
@Inherited
修饰的注解
- 接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有
被@Inherited
修饰 - 类实现接口时不会继承任何接口中定义的注解
4.自定义注解
4.1 注解架构
Annotation
与RetentionPolicy
、ElementType
。
每 1 个Annotation
对象,都会有唯一的RetentionPolicy
属性,有 1~n个ElementType
属性。ElementType
(注解的用途类型)
"每 1 个Annotation
" 都与 "1~n 个ElementType
" 关联。当Annotation
与某个ElementType
关联时,就意味着:Annotation
有了某种用途。例如,若一个Annotation
对象是METHOD
类型,则该Annotation
只能用来修饰方法。
package java.lang.annotation;
public enum ElementType {
TYPE, // 类、接口(包括注释类型)或枚举声明
FIELD, // 字段声明(包括枚举常量)
METHOD, // 方法声明
PARAMETER, // 参数声明
CONSTRUCTOR, // 构造方法声明
LOCAL_VARIABLE, // 局部变量声明
ANNOTATION_TYPE,// 注释类型声明
PACKAGE // 包声明
}
RetentionPolicy
(注解作用域策略)。
"每 1 个Annotation
" 都与 "1 个RetentionPolicy
" 关联。
- 若
Annotation
的类型为SOURCE
,则意味着:Annotation
仅存在于编译器处理期间,编译器处理完之后,该Annotation
就没用了。 例如,"@Override
" 标志就是一个Annotation
。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,"@Override
" 就没有任何作用了。 - 若
Annotation
的类型为CLASS
,则意味着:编译器将Annotation
存储于类对应的.class
文件中,它是Annotation
的默认行为。 - 若
Annotation
的类型为RUNTIME
,则意味着:编译器将Annotation
存储于.class
文件中,并且可由JVM读入。
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE, //Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了
CLASS, //编译器将Annotation存储于类对应的.class文件中。默认行为
RUNTIME //编译器将Annotation存储于class文件中,并且可由JVM读入
}
4.2 定义格式
@interface 自定义注解名{}
注意事项
- 定义的注解,自动继承了java.lang.annotation.Annotation接口
- 注解中的每一个方法,实际是声明的注解配置参数
- 方法的名称就是配置参数的名称
- 方法的返回值类型,就是配置参数的类型。只能是:基本类型/Class/String/enum
- 可以通过default来声明参数的默认值
- 如果只有一个参数成员,一般参数名为value
- 注解元素必须要有值,我们定义注解元素时,经常使用空字符串、 0 作为默认值。
案例
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation1 {
参数类型 参数名() default 默认值;
}
上面代码的作用是定义一个 Annotation
,我们可以在代码中通过 “@MyAnnotation1
” 来使用它。@Documented
, @Target
,@Retention
,@interface
都是来修饰 MyAnnotation1
的。含义:
@interface
使用@interface
定义注解时,意味着它实现了java.lang.annotation.Annotation
接口,即该注解就是一个Annotation
。
定义
Annotation
时,@interface
是必须的。注意:它和我们通常的
implemented
实现接口的方法不同。Annotation
接口的实现细节都由编译器完成。通过@interface
定义注解后,该注解不能继承其他的注解或接口。
@Documented
类和方法的Annotation
在缺省情况下是不出现在javadoc
中的。如果使用@Documented
修饰该Annotation
,则表示它可以出现在javadoc
中。
定义
Annotation
时,@Documented
可有可无;若没有定义,则Annotation
不会出现在javadoc
中。
@Target(ElementType.TYPE)
ElementType
是Annotation
的类型属性。而@Target
的作用,就是来指定Annotation
的类型属性的。@Target(ElementType.TYPE)
的意思就是指定该Annotation
的类型是ElementType.TYPE
。这就意味着,MyAnnotation1
是来修饰"类、接口(包括注释类型)或枚举声明"的注解。
定义
Annotation
时,@Target
可有可无。若有@Target
,则该Annotation
只能用于它所指定的地方;若没有@Target
,则该Annotation
可以用于任何地方。
@Retention(RetentionPolicy.RUNTIME)
RetentionPolicy
是Annotation
的策略属性,而@Retention
的作用,就是指定Annotation
的策略属性。@Retention(RetentionPolicy.RUNTIME)
的意思就是指定该Annotation
的策略是RetentionPolicy.RUNTIME
。这就意味着,编译器会将该Annotation
信息保留在.class
文件中,并且能被JVM虚拟机读取。
定义
Annotation
时,@Retention
可有可无。若没有@Retention
,则默认是RetentionPolicy.CLASS
。