这里要提到元注解的概念。什么是元注解?元注解就是注解上的注解,也就是注解上的标签。比如我们在自定义注解的时候,@Target、@Retention这些都是元注解。
那元注解有什么用的呢?我看不妨来看一下元注解的作用:
@Retention:注解生命周期范围。
@Target:注解对象的作用范围。
@Inherited:@Inherited标明子类是否可以继承该父类的注解。
@Documented:javadoc工具的文档化。
@Retention的值:
@Retention(RetentionPolicy.SOURCE) :注释仅存在源码中,class文件中不包含;
@Retention(RetentionPolicy.CLASS):默认策略,class文件中包含,运行时遗弃;
@Retention(RetentionPolicy.RUNTIME):class文件包含,运行时通过反射也可以获得;
@Target有很多值,就像上面提到的,注释不仅可以用在方法上,也可以用在包、类、字段等等其它上面。像@Override的@Target(ElementType.METHOD)标明注解的作用范围是方法。
==================================================================
通过反射获取注解是一个很常用的方法,但是需要注意的是,如果通过反射获取Annotation,那么这个Annotation的@Retention策略需要是RUNTIME的。这样就导致了反射获取注解应用范围有限。
定义一个@ByString的注解:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ByString {
int value();
}
在源码中标记这个注解:
@ByString(R.string.annotation_reflection)
private String text;
通过反射获取field:
Field[] fields = clazz.getDeclaredFields(