注解是什么样的东西,又是如何实现的,本文通过分析注解,以便能更好的理解和使用注解。
一、注解的作用与分类
注解的作用
- 生成文档,通过代码理标识的元数据生成javadoc文档;
- 编译检查,如我们经常遇到的override;
- 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码;
- 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。
注解的分类
- Java自带的标准注解,例如:@Override、@Deprecated和@SuppressWarning
- 元注解:用于定义注解的注解,包括@Retention(使用的时机)、@Target(使用范围)、@Inherited和@Documented
- 自定义注解:可以根据自已的需求定义注解,并可用元注解对自定义注解进行注解
二、以注解的形式实现类型安全
Android官方推荐的作法
定义成员:
public static final int SON = 1;
public static final int MOTHER = 2;
public static final int FATHER = 3;
定义注解范围:
@Retention({RetentionPolicy.SOURCE})
定义可以接受的常量列表
@IntDef({SON,MOTHER,FATHER})
定义注解的名称:
public @interface PEOPLE{}
使用:
public voide setPeople(@PEOPLE int people){
}
我觉得通过了解这个细节的点,以后要放弃枚举了,建议以注解的形式去实现。
三、元注解Taget
@Documented:可以生成Javadoc文件
@Retention:作用的时机,RUNTIME、CLASS、RESOUCE
@Target:使用范围,有TYPE、FIELED、METHOD、PACKAGE......
四、自定义注解的参数设置与读取
注解应用的很广,我们平常开发中也使用过注解框架,如Butterknife、RoboGuice等依赖注解的框架。
public class TestAnnotation{
@Retenttion(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface testMethod{
String userName() defalut "liujs";
int age();
}
}
@TestAnnotion.testMethod(userName="xmamiga",age=3)
public static void test(String userName, int age){
Log.d(TAG; "userName = " + userName + " age:" + age);
}
try{
TestAnnotation.testMethod testMethod = MainActivity.class.getDeclaredMethod("test",String.class,int.class).getAnnotation(TestAnnotation.testMethod.class);
test(testMethod.userName(),testMethod.age());
}catch(NoSuchMethodException e){
e.printStackTrace();
}
五、注解的原理
理解下注解的原理:
- 注解是如何被Java编译器编译的,注解信息是如何时集成到CLASS里面去的
- java -> class(类、字段、方法) -> 拥有各自的属性(attributes)
- 如何获取运行时的注解
- 注解对象是什么(jdk通过动态代理生成一个对象)