ProcessingEnvironment对象是apt的核心工具类
ProcessingEnvironment
一、简介:
ProcessingEnvironment所属模块 java.compiler-------javax.annotation.processing
自定义处理器可以使用框架提供的工具来编写新文件,报告错误消息以及查找其他实用程序
二、常用方法:
返回值 | 方法 | 含义 |
---|---|---|
Elements | getElementUtils() | 返回一些用于操作元素的实用方法的实现 |
Filer | getFiler() | 返回用于创建新的源,类或辅助文件的文件管理器。 |
Locale | getLocale() | 如果没有区域设置生效,则返回当前区域设置或 null 。 |
Messager | getMessager() | 返回用于报告错误,警告和其他通知的消息。 |
Map<String,String> | getOptions() | 返回传递给注释处理工具的特定于处理器的选项。 |
SourceVersion | getSourceVersion() | 返回任何生成的 source和 class文件应符合的源版本。 |
Types | getTypeUtils() | 返回一些用于对类型进行操作的实用程序方法的实现。 |
Elements
processingEnv.getElementUtils().getTypeElement(type).asType()获取Elements的类型
Filer
生成对应文件
Types
在获取到元素时,判断此元素的类型,做相关安全校验之类的
相关方法:
- 如果,该元素是否继承 Activity. 前者是否是后者的子类.
true当且仅当t1类型是t2类型的子类型时
任何类都是自生的子类
boolean isSubtype(TypeMirror t1, TypeMirror t2)
private boolean isSubtype(Element typeElement, String type) {
return processingEnv.getTypeUtils().isSubtype(typeElement.asType(),
processingEnv.getElementUtils().getTypeElement(type).asType());
}
- 该元素是否是 某个接口的实现
- 获取该元素的直接父类
List<? extends TypeMirror> directSupertypes(TypeMirror t)
返回类型的直接超类型。 接口类型(如果有)将显示在列表的最后。
对于没有直接超级接口的接口类型,将返回表示java.lang.Object的类型镜像。
用法
//用法1 判断某个类是否是目标类的子类
private boolean isSubType(TypeMirror type1, TypeMirror clazz) {
return env.getTypeUtils().isSubtype(type1, clazz)
|| env.getTypeUtils().directSupertypes(type1).contains(clazz);
}
//用法2 获取父类做其他事情
- 该元素是否就是某个类
判断t1和t2的类型是否相同
boolean isSameType(TypeMirror t1, TypeMirror t2)
//目标type
TypeMirror typeMirror =processingEnvironment
.getElementUtils()
.getTypeElement(annotationClass.getCanonicalName())
.asType();
//判断interfaceElement的类型 是否为 typeMirror 的类型
if(processingEnv.getTypeUtils().isSameType(interfaceElement.asType(), typeMirror.asType())){
return true;
}
查看相关api的网址目前看有这几个
1: https://www.php.cn/manual/view/25610.html
2: Java 11中文版 - API参考文档
https://www.apiref.com/java11-zh/java.compiler/javax/annotation/processing/ProcessingEnvironment.html
3: https://www.runoob.com/manual/jdk1.6/java.compiler/javax/lang/model/util/Types.html