SOURCE(源码时),CLASS(编译时),RUNTIME(运行时)
- @Target 可以用来修饰哪些程序元素,如 TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER 等,未标注则表示可修饰所有
ANONOTATION_TYPE(注解类型声明),
PACKAGE(包)
TYPE (类,包括enum及接口,注解类型)
METHOD (方法)
CONSTRUCTOR (构造方法)
FIFLD (成员变量)
PARAMATER (参数)
LOCAL_VARIABLE (局部 变量)
- @Inherited 是否可以被继承,默认为 false
需要注意的是注解是不可以继承的,@Inherited 的意思是 假如我们把注解应用到 A 类中,B 类继承 A ,那么 B 可以扫描到 A 的注解。
注解的继承”(依赖倒置?)
这里讲的继承并不是通过@Inherited修饰的注解。
这个“继承”是一个注解的使用技巧,使用上的感觉类似于依赖倒置,来自于ButterKnife源码。
先看代码。
@Target(METHOD)
@Retention(CLASS)
@ListenerClass(
targetType = “android.view.View”,
setter = “setOnClickListener”,
type = “butterknife.internal.DebouncingOnClickListener”,
method = @ListenerMethod(
name = “doClick”,
parameters = “android.view.View”
)
)
public @interface OnClick {
/** View IDs to which the method will be bound. */
int[] value() default { View.NO_ID };
}
这是ButterKnife的OnClick 注解。特殊的地方在于@OnClick修饰了注解@ListenerClass,并且设置了一些只属于@OnClick的属性。
那这样的作用是什么呢?
凡是修饰了@OnClick的地方,也就自动修饰了@ListenerClass。类似于@OnClick是@ListenerClass的子类