Android注解使用

注解在Android开发中经常被使用到,特别是在很多当前流行的第三方框架中都有用到,比如:Retrofit、EventBus、Glide、Dragger2等等

什么是注解?

Annotation是Java5开始引入的新特征,中文称之为注解;是程序元素(类、方法、成员变量)的修饰符。Java有自带的注解,当然我们也可以自定义;先看看自定义注解的例子

@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Test {
    String name() default "";
    int id() default -1;
}

元注解

可以看到自定义注解里也会有注解存在,给自定义注解使用的注解就是元注解。

@Rentention Rentention用来标记自定义注解的有效范围,他的取值有以下三种:

RetentionPolicy.SOURCE: 只在源代码中保留 一般都是用来增加代码的理解性或者帮助代码检查之类的,比如我们的Override;
RetentionPolicy.CLASS: 默认的选择,能把注解保留到编译后的字节码class文件中,仅仅到字节码文件中,运行时是无法得到的;
RetentionPolicy.RUNTIME: ,注解不仅 能保留到class字节码文件中,还能在运行通过反射获取到,这也是我们最常用的。

@Target
@Target指定Annotation用于修饰哪些程序元素。
@Target也包含一个名为”value“的成员变量,该value成员变量类型为ElementType[ ],ElementType为枚举类型,值有如下几个:

ElementType.TYPE:能修饰类、接口或枚举类型
ElementType.FIELD:能修饰成员变量
ElementType.METHOD:能修饰方法
ElementType.PARAMETER:能修饰参数
ElementType.CONSTRUCTOR:能修饰构造器
ElementType.LOCAL_VARIABLE:能修饰局部变量
ElementType.ANNOTATION_TYPE:能修饰注解
ElementType.PACKAGE:能修饰包
使用了@Documented的可以在javadoc中找到
使用了@Interited表示注解里的内容可以被子类继承,比如父类中某个成员使用了上述@From(value),From中的value能给子类使用到。

注解的参数成员

注解的成员变量定义如下:

String name() default "";
注解中参数成员只支持int、short、long、byte、char、float、double、boolean八中基本数据类型和String、Enum、Class、annotations以及它们的数组类型;
注解中参数成员默认修饰符是public,并且注解中不能定义方法

通过反射获取注解

利用反射是获取注解的唯一方式,我们用上面定义的注解定义一个类

@Test
public class Bean {
    @Test(name = "hello", id = 12)
    private String name;
}

通过反射得到注解的值:

public static void main(String args[]) {
        Bean bean = new Bean();
        Class clazz = bean.getClass();
        try {
            Field name = clazz.getDeclaredField("name");
            if (name.isAnnotationPresent(Test.class)) {
                Test annotation = name.getAnnotation(Test.class);
                System.out.println("name:"+annotation.name()+" id:"+annotation.id());
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

运行得到如下结果:

name:hello id:12

Process finished with exit code 0

注解的用处

  1. 生成文档,这是最常见的,也是Java最早提供的;常用的有@param、@return;
  2. 跟踪代码依赖性,实现替代配置文件功能,比如Dragger2依赖注入;未来Java开发,将大量注解配置,具有很大用处;
  3. 在编译时进行格式检查,如@override放在方法前,如果这个方法并没有覆盖超类方法,则会检查出来;
  4. 包含一些重复性动作,使用注解简化与自动化,比如ButterKnife框架;
  5. 做一下配置参数的业务。

你可能感兴趣的:(Android注解使用)