注解学习

理论学习

是什么

  • 是什么

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

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

    • 类型(类,接口,枚举)
    • 构造器
    • 属性(变量/域)
    • 方法
    • 参数
    • 局部变量

注解类型和注解

  • 注解类型:特殊的接口
  • 注解:注解类型的实例
  • 两者关系类似于类与实例的关系

分类

  • 源码注解:只在源码中存在
  • 编译时注解:在class中仍然存在
  • 运行时注解:运行阶段起作用

标准注解

  • @Override

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

  • @Deprecated

    方法被弃用

  • @SuppressWarning

    抑制警告

标准元注解

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

  • @Decymented

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

  • @Inherited

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

  • @Retension

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

    • SOURCE: 只在源代码中存在,被编译器丢弃
    • CLASS: 在类文件中记录,默认值
    • RUNTIME: 在运行时起作用,可被反射获取

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

  • @Target

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

    • ANNOTATION_TYPE:可以对注解进行标注
    • CONSTRUCTION:可以对构造器进行标注
    • FIELD:可以对域(成员变量,属性)进行标注
    • LOCAL_VARIBLE: 可以对局部变量进行标注
    • METHOD:可以对方法进行标注
    • PACKAGE:可以对包进行标注
    • PARAMETER:可以对参数进行注解
    • TYPE:可以对类型(类,枚举类,接口)进行注解

    语法

    • 声明

      @Documented
      @Retention(RetentionPolicy.RUNTIME)
      @Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
      public @interface CostomAnnotation {
          String name();
          String age();
      }
      

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

实例

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

   @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);
                }
            }
      
        }
    }
      
    
??正文结束??
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值