• Java注解的认识


        关于注解,经常用到,其实就是简化代码的一个东西而已,其一般步骤就是:

     1、定义注解

     2、使用注解

     3、获取注解的值(Java反射)

     4、用注解的值

        注解的定义和接口的区别就是 在interface前面加上@符号 如下:

        首先定义一个注解AClassAnnotation

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AClassAnnotation {
        int id() default -1;
        String name();
    }

    标签分一些类型,不同的类型给Java中不同的地方标记,类型使用@Target来设置,@Target 有下面的取值

    • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
    • ElementType.CONSTRUCTOR 可以给构造方法进行注解
    • ElementType.FIELD 可以给属性进行注解
    • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
    • ElementType.METHOD 可以给方法进行注解
    • ElementType.PACKAGE 可以给一个包进行注解
    • ElementType.PARAMETER 可以给一个方法内的参数进行注解
    • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

              @Retention来控制标签的生命周期,其实就是你在什么时候去处理这个标签,处理完肯定不要了,不然占空间

    • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
    • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
    • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
         
          定义一个用于成员变量字段的注解
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AFiledAnnotation {
        int value();
    }
          定义一个TestActivity来使用注解去加载对应的控件
      
    @AClassAnnotation(name = "test")
    public class TestActivity extends AppCompatActivity {
        @AFiledAnnotation(R.id.myTextView)
        private TextView textView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
    
            initAnnotation();
            textView.setOnClickListener(new View.OnClickListener() {//此时已经完成了textView的初始化,所以可以直接设置控件的点击事件
                @Override
                public void onClick(View v) {
                    Toast.makeText(TestActivity.this, "点击了我", Toast.LENGTH_SHORT).show();
                }
            });
        }
    
        private void initAnnotation() {
            Field[] fields=this.getClass().getDeclaredFields();
            for (Field field:fields) {
                field.setAccessible(true);//设置成员变量为可访问的
                AFiledAnnotation aFiledAnnotation=field.getAnnotation(AFiledAnnotation.class);//获取该属性的注解对象
                try {
                    field.set(this,findViewById(aFiledAnnotation.value()) );//设置该对象值  完成了对该对象的赋值
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
    
            }
        }
    
    }

       到这里你会发现其实 Butterknife的注解就是这么用的 

      

  • 相关阅读:
    12.22冲刺总结
    Android远程服务
    短信电话监听
    Android本地服务
    意图
    多线程下载
    异步HTTP请求
    提交数据到服务器
    通过HTTP访问网络资源
    观察者
  • 原文地址:https://www.cnblogs.com/bimingcong/p/11959512.html
Copyright © 2020-2023  润新知