Android注解

注解是什么样的东西,又是如何实现的,本文通过分析注解,以便能更好的理解和使用注解。

一、注解的作用与分类

注解的作用

  • 生成文档,通过代码理标识的元数据生成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通过动态代理生成一个对象)

参考Java注解(Annotation)原理详解