从java5开始,Java支持在源文件中嵌入补充信息,这类信息称为注解annotation。注解不会改变程序的动作,因此也不会改变程序的语义。
1.注解是基于接口的机制创建的。
public @interface AnnoDemo {
String strVal();
int setVal();
}
所有的注解只包含方法声明,没有方法实现;所有注解类型都自动扩展了Annotation接口。
创建好注解后可以使用声明注解了,可以用于类,方法,成员变量,参数,枚举常量,包括注解本身。
2.注解的保留策略
java定义了3种保留策略:SOURCE,CLASS,RUNTIME
1.使用SOURCE保留策略的注解,只在源文件中保留,在编译期间会被抛弃。
2.使用CLASS保留策略的注解,在编译后的calss中保留,在jvm运行期间会被抛弃。
3.使用RUNTIME保留策略的注解,在编译后的calss中保留,在jvm运行期间可以得到这些注解,它提供了永久的注解。
保留级别通过使用@Retention(RetentionPolicy.XXX)指定,
如果没有为注解指定保留级别,默认保留级别为RetentionPolicy.CLASS。
3.使用反射获取注解。
略。。。
4.注解的分类。
1.标记注解
标记注解不包含成员,唯一的目的是标记声明。
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationMark{}
2.单成员注解
单成员注解只有一个成员
3.内置注解
Java提供了许多专用内置注解,来自java.lang.annotation包的:
①Retention被设计为只能用于注解其它注解,指定保留策略。
②@Doucumented是标记接口,用于通知某个工具————注解将被文档化。只能注解其它注解。
③@Target 用于指定可以应用注解声明的类型,被设计为只能注解其它注解。
@Target只有一个参数,这个参数来自于ElementType枚举的常量,这个参数指定了将为其应用注解的声明的类型。
目标常量 | 可应用注解的声明的类型 |
ANNOTATION_TYPE | 另一个注解 |
CONSTRUCTOR | 构造函数 |
FIELD | 域变量 |
LOCAL_VARIABLE | 局部变量 |
METHOD | 方法 |
PACKAGE | 包 |
PARAMETER | 参数 |
TYPE | 类,接口,枚举 |
例子:
@Target({ElementType.FIELD,ElementType.LOCAL_VARIABLE})
4.@Inherited 标记注解,只能用于另外一个注解声明,会导致超类的注解被子类继承,如果检查子类的注解不存在,就去超类检查如果存在并使用
@Inherited注解,就返回那种注解。
5.@Override 只能用于方法,确保超类的方法被真正的重写。
6.@Deprecated 过时
7.@SafeVarargs 指示没有发生与可变长度参数相关的不安全动作。
8.@SuppressWarnings 抑制警告
5.注解的使用限制
①注解不能继承另一个注解
②注解声明的所有方法不带有参数
③注解不能被泛型化