注解基础知识

2022-06-18  本文已影响0人  三十五岁养老

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

作用

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

注解的特点

注解的分类

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

JDK:

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


image.png

系统注解:


image.png

三方注解:

框架里面定义的注解,如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编译时,才会调用到我们这个自定义的注解处理器方法。

手动注册:

自动注册:

使用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技术

上一篇下一篇

猜你喜欢

热点阅读