元数据管理方式:注解
注解是提供一种为程序元素设置元数据的方法
1.元数据是添加到程序元素如方法/字段/类/包上的额外信息。
2.注解是一种分散式的元数据的设置方式,xml是集中式的设置方式。
3.注解不能直接干扰代码的运行。
注解的功能
1.作为特定的标记,告诉编译器一些信息
2.编译时动态处理,如动态生成代码
3.运行时动态处理,作为额外信息的载体,如获取注解信息。
注解分类:
1.标准注解:@override/@deprecated等
2.元注解:@ Retention/@Target/@Inherited/@Document
3.自定义注解
元注解:用于修饰注解的注解,通常用在注解的定义上:
1.@Target: 注解的作用目标
2.@ Retention:注解的生命周期
3.@Document:注解是否应该包含在javaDoc 文档中
4.@Inherited:是否允许子类继承该注解
java.lang.annotation.Annotation
package java.lang.annotation;
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
java.lang.annotation.Annotation 是一个接口,我们写一个测试注解看看是如何和这个接口关联起来的
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface TestAnnotation {
}
javap -verbose TestAnnotation反编译后:
public interface com.tc.javabase.annotation.TestAnnotation extends java.lang.annotation.Annotation
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT, ACC_ANNOTATION
Constant pool:
1 = Class #14 // com/tc/javabase/annotation/TestAnnotation
2 = Class #15 // java/lang/Object
3 = Class #16 // java/lang/annotation/Annotation
4 = Utf8 SourceFile
5 = Utf8 TestAnnotation.java
6 = Utf8 RuntimeVisibleAnnotations
7 = Utf8 Ljava/lang/annotation/Target;
8 = Utf8 value
9 = Utf8 Ljava/lang/annotation/ElementType;
10 = Utf8 METHOD
11 = Utf8 Ljava/lang/annotation/Retention;
12 = Utf8 Ljava/lang/annotation/RetentionPolicy;
13 = Utf8 SOURCE
14 = Utf8 com/tc/javabase/annotation/TestAnnotation
15 = Utf8 java/lang/Object
16 = Utf8 java/lang/annotation/Annotation
{
}
SourceFile: "TestAnnotation.java"
RuntimeVisibleAnnotations:
0: #7(#8=[e#9.#10])
1: #11(#8=e#12.#13)