一,元注解
java提供的基础的注解 , 注解其他的注解 , 如下:
- @Retention:注解保留的生命周期
- @Target:注解对象的作用范围。
- @Inherited:@Inherited标明所修饰的注解,在所作用的类上,是否可以被继承。
- @Documented:如其名,javadoc的工具文档化,一般不关心
@Retention
Retention的表示注解的生命周期 , 对应 RetentionPolicy 的枚举 , 表示注解在何时生效
-
SOURCE:只在源码中有效,编译时抛弃,如上面的
@Override
。 -
CLASS:编译class文件时生效。
-
RUNTIME:运行时才生效。
比如在编译期的判空 ,
@Target
Target标明了注解的适用范围,对应ElementType枚举,明确了注解的有效范围。
- TYPE:类、接口、枚举、注解类型。
- FIELD:类成员(构造方法、方法、成员变量)。
- METHOD:方法。
- PARAMETER:参数。
- CONSTRUCTOR:构造器。
- LOCAL_VARIABLE:局部变量。
- ANNOTATION_TYPE:注解。
- PACKAGE:包声明。
- TYPE_PARAMETER:类型参数。
- TYPE_USE:类型使用声明。
如上图X1所示,@Nullable
可用于注解方法,参数,类成员,注解,包声明中,常用例子如下所示:
/**
* Nullable表明
* bind方法的参数target和返回值Data可以为null
*/
@Nullable
public static Data bind(@Nullable Context target) {
//do someThing and return
return bindXXX(target);
}
@Inherited
注解所作用的类,在继承时默认无法继承父类的注解。除非注解声明了 @Inherited。同时Inherited声明出来的注,只对类有效,对方法/属性无效。
如下方代码,注解类@AInherited
声明了Inherited ,而注解BNotInherited 没有,所在在它们的修饰下:
- 类Child继承了父类Parent的
@AInherited
,不继承@BNotInherited
; - 重写的方法
testOverride()
不继承Parent的任何注解; testNotOverride()
因为没有被重写,所以注解依然生效。
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface AInherited {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
public @interface BNotInherited {
String value();
}
@AInherited("Inherited")
@BNotInherited("没Inherited")
public class Parent {
@AInherited("Inherited")
@BNotInherited("没Inherited")
public void testOverride(){
}
@AInherited("Inherited")
@BNotInherited("没Inherited")
public void testNotOverride(){
}
}
/**
* Child继承了Parent的AInherited注解
* BNotInherited因为没有@Inherited声明,不能被继承
*/
public class Child extends Parent {
/**
* 重写的testOverride不继承任何注解
* 因为Inherited不作用在方法上
*/
@Override
public void testOverride() {
}
/**
* testNotOverride没有被重写
* 所以注解AInherited和BNotInherited依然生效。
*/
}