美文网首页
注解基础知识

注解基础知识

作者: 三十五岁养老 | 来源:发表于2022-06-18 22:55 被阅读0次

    注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。

    作用

    1.生成帮助文档。这是最常见的,也是 Java 最早提供的注解。常用的有 @see、@param 和 @return 等;
    2.跟踪代码依赖性,实现替代配置文件功能。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;
    3.在编译时进行格式检查。如把 @Override 注解放在方法前,如果这个方法并不是重写了父类方法,则编译时就能检查出。

    注解的特点

    • 注解可以在变量,方法,类之上加载
    • 注解可以有属性也可以没有属性 @Override @Test(timeout=1000)
    • 注解有作用范围(源码,编译期间,运行期间)

    注解的分类

    JDK的,自定义的,第三方的(比如框架)

    JDK:

    元注解:定义其他注解的注解


    image.png
    • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
    • @Documented - 标记这些注解是否包含在用户文档中。
    • @Target - 标记这个注解应该是哪种 Java 成员。
    • @Inherited - 标记这个注解是继承于哪个注解类(默认注解并没有继承于任何子类)

    系统注解:


    image.png
    • Override - 检查该方法是否是重载方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
    • @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
    • @SuppressWarnings - 指示编译器去忽略注解中声明的警告。

    三方注解:

    框架里面定义的注解,如ButterKnife 框架里面bindview等

    自定义注解

    定义注解三板斧:
    定义注解——相当于定义标记
    配置注解——把标记打在需要用到的程序代码中;
    解析注解——在编译期(别忘了AutoService注册)或运行时检测到标记,并进行特殊操作

    编译期注解(APT)原理

    APT即为Annotation Processing Tool,它是javac的一个工具,中文意思为编译时注解处理器。APT可以用来在编译时扫描和处理注解。通过APT可以获取到注解和被注解对象的相关信息,在拿到这些信息后我们可以根据需求来自动的生成一些代码,省去了手动编写。注意,获取注解及生成代码都是在代码编译时候完成的,相比反射在运行时处理注解大大提高了程序性能。APT的核心是AbstractProcessor类。

    当通过javac将.java文件编译成.class文件时。编译过程大致可以分为3个过程:

    • 解析与填充符号表过程
    • 插入式注解处理器的注解处理过程
    • 分析与字节码生成过程

    而插入式注解处理器的注解处理过程主要就是对AbstractProcessor这个类的调用。所以,当我们自定义这个类的子类的时候,在编译器就会执行这个类中的方法
    从JDK1.6开始,提供了插入式注解处理器的标准API在编译期间对注解进行处理

    通过注解处理器API实现一个编译器插件,需要继承抽象类javax.annotation.processing.AbstractProcessor,重写抽象方法process(),这个方法在javac编译器在执行注解处理器代码时调用。这个方法有两个参数,第一个参数表示注解处理器所有处理的注解集合,第二个参数roundEnvironment表示当前这个Round中的语法树节点,每个语法树节点在这里表示一个Element。这里的Element包括如下元素:包(PACKAGE)、枚举(ENUM)、类(CLASS)、注解(ANNOTATION_TYPE)、接口(INTERFACE)等。

    在android开发中使用的AbstractProcessor这个类是JDK通过javac编译的时候用来处理注解的。而android sdk中删除了这个类,所以我们需要通过创建java library库来获取这个.

    AbstractProcessor的子类已经有了,但是要想在编译时期被执行,需要向javac注册我们这个自定义的注解处理器(即将这个库变成jar包的形式),这样,在javac编译时,才会调用到我们这个自定义的注解处理器方法。

    手动注册:

    • 在src/main目录下创建resources/META-INF/services/javax.annotation.processing.Processor文件。

    • 在javax.annotation.processing.Processor中写入自定义的Processor的全名,如果有过个Processor的话,每行写一个。如:com.soulmate.processor.MyProcessor

    自动注册:

    使用AutoService注解,AutoService会自动在META-INF文件夹下生成Processor配置信息文件,该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,

    就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。应用依赖如下
    compile 'com.google.auto.service:auto-service:1.0-rc2'

    APT应用场景

    APT技术被广泛的运用在Java框架中,包括Android项目以及Java后台项目,除了上面我们提到的ButterKnife之外,像EventBus 、Dagger2以及阿里的ARouter路由框架等都运用到APT技术

    相关文章

      网友评论

          本文标题:注解基础知识

          本文链接:https://www.haomeiwen.com/subject/gtywmrtx.html