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

 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的注解就是这么用的 

 

  

posted on 2019-11-29 18:28  毕哥  阅读(182)  评论(0编辑  收藏  举报