注解的作用
- 在jdk1.5版本添加的特性,当项目特别庞大,配置文件很复杂,本来可能需要很多配置文件,需要很多逻辑才可以实现的内容,可以使用一个或者多个注解来替代,这样可以简化编程,代码更加清晰。
注解种类
- 注解按照来源分为三类
JDK注解
第三方注解
自定义注解 - jdk注解
- jdk注解也有三类,分别为:@Override, @Deprecated, @SuppressWarnings(“deprecation”)
- 第一种:@Override
用来标记这是一个重写方法,若此方法并非重写方法,会在编译期报错。
- 第二种:@Deprecated
用来标记这是一个过时方法,会在使用此方法时为此方法加上一条横线。
- 第二种:@SuppressWarnings(“deprecation”)
用来去除警告
- 第三方注解(暂不讨论)
自定义注解
- 使用@interface 注解名称 来申明一个注解
通过反编译工具可以看到,
public @interface MyAnnotation {}
反编译后为
public interface MyAnnotation extends Annotation{}
注意:
jdk规定,反编译后的这种形式,不能用来定义注解
- 代码演示如下
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyAnnotation {
String desc();
String author();
int age() default 18;
}
-
注解的注解属性
注解本质上是一个接口
可以有变量和方法
但接口中的属性是public static final修饰的,在注解中没有意义。
故:在注解中,我们经常使用的是方法。而此接口中的方法在注解中,称为注解属性
上面代码演示中 int age() default 18; 就是一个 注解属性 -
注解属性类型
- 基本类型
- String类型
- Class类型
- 注解类型
- 一维数组类型
- 枚举类型
-
注解的使用
- 定义注解属性时可以给注解赋默认值,用default关键字。
- 定义的注解属性若没有default默认值,则,在引用注解时,必须给此注解属性赋值。
- 如果有多个注解属性,都需要赋值,用”,“分隔。
- 当注解属性的属性名为"value", 且此注解只有这个注解属性需要赋值,在赋值时可以省略注解名,直接写入注解值即可。 其他情况,即使注解名为value,也需要带上注解名赋值。
-
元注解
- 元注解有四个,如下,我们一一介绍
@Retention
@Target
@Documented
@Inherited
其中,@Retention和@Target是自定义注解时,必须使用的两个元注解 - 第一个:@Retention
指定注解信息在那个阶段存在
值域:可以多个值同时存在。
1. Source :编译期有效
2. Class :解释执行时有效(.class文件加载到jvm虚拟机时)
3. Runtime :运行期有效 - 第二个:@Target
指定注解用来修饰什么的。
如:修饰类还是修饰方法等
值域:ElementType.枚举常量 常量值域如下表:
- 第三个:@Documented
使用该元注解修饰,该注解信息会生成javadoc文档中。
- 第四个:@Inherited
使用该元注解修饰,应用注解目标类的子类会自动继承该注解。
- 元注解有四个,如下,我们一一介绍