Android 注解学习

作者: tinuv 发布时间: 2019-09-10 浏览: 1927 次 编辑

理论学习

是什么

  • 是什么

    注解是告知编译器要做什么的说明

  • 可以对哪些元素进行注解

    • 类型(类,接口,枚举)

    • 构造器

    • 属性(变量/域)

    • 方法

    • 参数

    • 局部变量

注解类型和注解

  • 注解类型:特殊的接口

  • 注解:注解类型的实例

  • 两者关系类似于类与实例的关系

分类

  • 源码注解:只在源码中存在

  • 编译时注解:在class中仍然存在

  • 运行时注解:运行阶段起作用

标准注解

  • @Override

    覆盖父类(超类)的一个方法

  • @Deprecated

    方法被弃用

  • @SuppressWarning

    抑制警告

标准元注解

元注解:对注解进行标注的注解,说白了就是就是可以定义注解,这个字已经说得很清楚了

  • @Decymented

    标记类注解,用于对注解类型的声明进行标注,使该注解的实例包含在利用Javadoc或类似工具产生的文档里面

  • @Inherited

    使用此注解标注,使得被标注的注解类型的任何实例都会被继承(不大怎么清楚)

  • @Retension

    表示被标注的注解内心不够会保存多久,可以是:

    他们都在java.lang.annotation.RetentionPolicy这个枚举类中

    • SOURCE: 只在源代码中存在,被编译器丢弃

    • CLASS: 在类文件中记录,默认值

    • RUNTIME: 在运行时起作用,可被反射获取

  • @Target

    表示哪些程序类型可以被注解类型的实例进行标注,取值可以为:

    语法

    • 声明



      一个特殊的接口,然后使用元注解对其进行定义

    • ANNOTATION_TYPE:可以对注解进行标注

    • CONSTRUCTION:可以对构造器进行标注

    • FIELD:可以对域(成员变量,属性)进行标注

    • LOCAL_VARIBLE: 可以对局部变量进行标注

    • METHOD:可以对方法进行标注

    • PACKAGE:可以对包进行标注

    • PARAMETER:可以对参数进行注解

    • TYPE:可以对类型(类,枚举类,接口)进行注解

实例

注解一般与反射配合,因为注解只是一个接口(特殊的接口),只有方法声明,没有方法体,如果不实现方法体那么只有一个标注的作用,如

   @Override
    @CostomAnnotation(name = "tinuv", age = "21")
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        mBroadcastReceiver = new NetWorkBroadcastReceiver();
        registerReceiver(mBroadcastReceiver, intentFilter);
    }

配合反射使用

  • 自定义注解

    import java.lang.annotation.*;
      @Documented
      @Retention(RetentionPolicy.RUNTIME)
      @Target({ElementType.FIELD, ElementType.METHOD})
      public @interface CostomAnnotation {
        int code();
     }
  • 使用注解

    package annotationdemo;
      public class TestClass {
        @CostomAnnotation(code = 10)
        private int value;
      
        @Override
        public String toString() {
            return value + "";
        }}
  • 配合反射实现注入

    package annotationdemo;
      import java.lang.reflect.Field;
      public class Main {
        public static void main(String[] args) throws IllegalAccessException {
            Class c = TestClass.class;
            TestClass testClass = new TestClass();
            Field[] fields = c.getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(CostomAnnotation.class)) {
                    CostomAnnotation annotation = field.getAnnotation(CostomAnnotation.class);
                    int code = annotation.code();
                    field.setAccessible(true);
                    field.setInt(testClass,code);
                    System.out.println(testClass);
                }
            }
      
        }}