1. 注解简介
1.1 什么是注解
注解(Annotation):Java注解用于为Java代码提供元数据,是从JDK5.0开始引入的新技术。
注解的位置:Java源码的类、方法、字段、参数前,作为一种特殊“注释”。
注解的作用:用于帮助我们更快捷的写代码。
元数据:元数据用于对数据进行说明(一种标识),Annotation就是Java的元数据。
1.2 注解分类
1.2.1 内建注解
有三个注解在java.lang
包下,提供了编译检查的作用。
注解 | 说明 |
---|---|
@Override | 只能标注方法,检查该方法是否是重写方法 |
@Deprecated | 标注内容不在被建议使用(删除线) |
@SuppressWarnings | 编译器将忽略标注内容产生的警告 |
1.2.2 元注解
这些注解是作用在其他注解的注解。
注解 | 说明 |
---|---|
@Retention | 标注该注解类型的注解保留时长 |
@Documented | 标注该注解的内容将出现在javadoc中 |
@Target | 标注该注解属于那种Java成员 |
@Inherited | 标注该注解是继承于哪个注解类 |
1.2.3 自定义注解
除了可以使用已经提供的注解外,我们也可以通过@interface
自定义注解。
2. Annotation组成
java.lang.annotation
包的组成如下:
其中我们需要关注的有RetentionPolicy
、ElementType
。
2.1 RetentionPolicy
该类与Retention元注解类型一起使用,以指定Annotation要保留多长时间。(单选值)
RetentionPolicy类的内容如下:
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
SOURCE
:标注Annotation在编译器处理期间将被丢弃。
CLASS
:默认,注解将由编译器记录在类文件中,但运行时VM不保留注解。
RUNTIME
:运行时注解保留在VM中,可通过反射性地读取注解。
2.2 ElementType
该类与Target元注解类型一起使用,以指定Annotation所适用的程序元素类型。(多选值)
ElementType类的内容如下:
public enum ElementType {
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE,
TYPE_PARAMETER,
TYPE_USE
}
TYPE
:类、接口(包括注释类型)或枚举声明
FIELD
:字段声明(包括枚举常量)
METHOD
:方法声明
PARAMETER
:参数声明
CONSTRUCTOR
:构造声明
LOCAL_VARIABLE
:局部变量声明
ANNOTATION_TYPE
:注解类型声明
PACKAGE
:包声明
TYPE_PARAMETER
:参数类型声明
TYPE_USE
:类型使用
3. 内建注解
3.1 @Override
定义在java.lang.Override
中,此注释只使用于修辞方法,表示一个方法声明打算重写超类中的另一个方法的声明。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Override
public String toString() {
return "Test01_NJ{}";
}
该注解类的内容如下:
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
3.2 @Deprecated
使用@Deprecated
注解标注内容不在被建议使用(删除线),但一样会运行被标注的方法。
该注解类的内容如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
3.3 @SuppressWarnings
使用@SuppressWarnings
注解时,编译器将忽略标注内容产生的警告(右边黄线)。
该注解类的内容如下:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
4. 元注解
4.1 @Retention
使用@Retention
注解,标识Annotation类型的注解保留的时长(作用域)。当注解类型声明中没有@Retention元注解,则默认保留策略为RetentionPolicy.CLASS
。
选型(单选):SOURCE,CLASS,RUNTIME
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{ }
该注解类的内容如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
4.2 @Documented
类和方法的 Annotation 在缺省情况下是不出现在 javadoc 中的。如果使用 @Documented 修饰该 Annotation,则表示它可以出现在 javadoc 中。
@Documented
@interface MyAnnotation{ }
该注解类的内容如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
4.3 @Target
通过 @Target 注解,标识该Annotation类型的所适用的程序元素类型。
选型(多选):TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,ANNOTATION_TYPE,PACKAGE,TYPE_PARAMETER, TYPE_USE
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
@interface MyAnnotation{ }
该注解类的内容如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
4.4 @Inherited
通过 @interface 注解,标识该注解将具有继承性。当使用了@Inherited注解后,该Annotation的子类将自动继承注解
@Inherited
@interface MyAnnotation{ }
该注解类的内容如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
5. 自定义注解
除了可以使用已经提供的注解外,我们也可以通过@interface
自定义注解。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
-
设置默认值:自定义注解时,通过
default
设置默认值。(默认为-1时,表示不存在) -
返回值类型:基本类型、Class,String,Enums。
-
如果只有一个参数成员,一般参数名为value
⚠️注意:注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值。
// 自定义注解如下
// 适用于方法,RUNTIME
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
String name() default "";
int age() default 0;
int id() default -1;
String[] games() default {"game1","game2"};
}
// 在方法上使用该注解
// 注解中,通过可以属性名赋值
@MyAnnotation(name = "张三")
public void test(){}
6. 写在最后
使用注解时必须使用@符号!
学习注解是为了够更好的看懂注解。
t 0;
int id() default -1;
String[] games() default {“game1”,“game2”};
}
```java
// 在方法上使用该注解
// 注解中,通过可以属性名赋值
@MyAnnotation(name = "张三")
public void test(){}
6. 写在最后
使用注解时必须使用@符号!
学习注解是为了够更好的看懂注解。