简介
介绍一下注释类内容:
Documented
是否会保存到 Javadoc 文档中Inherited
是否可以被继承,默认为 falseRetention
注解的保留方式Target
注解的作用范围
Retention
注解的保留方式。如果注释类型声明中不存在 Retention 注释,则保留策略默认为RetentionPolicy.CLASS
RetentionPolicy中的枚举常量简介如下:
CLASS
编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
(保留在源码中,同时也保留到class中,但是不加载到虚拟机中 )RUNTIME
编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
(保留到源码中,同时也保留到class中,最后加载到虚拟机中)SOURCE
编译器要丢弃的注释。
(只保留在源码中,不保留在class中,同时也不加载到虚拟机中 )
Target
注解的作用范围。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
此元注释指示该声明类型是其自身,即元注释类型。它只能用在注释类型声明上:
@Target(ElementType.ANNOTATION_TYPE)
public @interface MetaAnnotationType {
...
}
此元注释指示该声明类型只可作为复杂注释类型声明中的成员类型使用。它不能直接用于注释:
@Target({})
public @interface MemberType {
...
}
这是一个编译时错误,它表明一个 ElementType 常量在 Target 注释中出现了不只一次。例如,以下元注释是非法的:
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})
public @interface Bogus {
...
}
ElementType中的枚举常量简介如下:
ElementType.FIELD
注解作用于变量ElementType.METHOD
注解作用于方法ElementType.PARAMETER
注解作用于参数ElementType.CONSTRUCTOR
注解作用于构造方法ElementType.LOCAL_VARIABLE
注解作用于局部变量ElementType.PACKAGE
注解作用于包
简介暂时到这儿...
用法
到了这里我们还是先说说注解的双面性吧,一种是低性能,一种是黑科技!
如 xutils , afinal 目前的注入使用的都是运行时注解,这是低性能的代表,当然还有一种黑科技,代表就是我们常用的ButterKnife ...
这里我们先讲一下简单使用:
先创建一个简单的注释类:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnonation {
String name() default "";
int Id();
}
然后我们简单的使用它:
@TestAnnonation(name = "This is my first comment" , Id = 2017)
private void testAnno(){
}
通过下面的方法将这个注解打印出来:
private void outputAnnoDetail(Class clazz){
Method [] methods = clazz.getDeclaredMethods();
for(Method method : methods) {
TestAnnonation testAnnonation = method.getAnnotation(TestAnnonation.class);
if (testAnnonation != null) {
Log.d("anonation", "name = " + testAnnonation.name());
Log.d("anonation", "Id = " + testAnnonation.Id());
}
}
}
结果如下:
name = This is my first comment
Id = 2017
这是一个运行时注解,注解的作用就是标记一个可以被识别的作用域,可以被其他地方获取解释或者被编译机识别等作用。
下一边博客介绍编译时注解,我们传说中的黑科技…