zoukankan      html  css  js  c++  java
  • 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的注解就是这么用的 

      

  • 相关阅读:
    AM3715/DM3730 更改内存大小后kernel boot不起来的解决办法
    xslt转换xml文档&&xslt call java方法
    VSCode 运行go test显示打印日志
    tomcat作为windows服务的参数配置,特别是PermSize的设置
    高亮显示web页表格行
    深入分析 Java 中的中文编码问题
    webwork和spring多配置文件的方法
    Bug笔记:诡异的$.ajax
    C#多态
    委托的本质
  • 原文地址:https://www.cnblogs.com/bimingcong/p/11959512.html
Copyright © 2011-2022 走看看