1. 絮絮叨叨
要么是注解跟我有仇,要么是公司配发的笔记本跟我有仇,要么是因为心急吃不了热豆腐
痛定思痛:从头开始,新建一个Java项目,实现一个超级简单的注解@Hello
通过获取被标识类的类名(原类),创建对应的Hello类;Hello类中,有一个sayHello()方法,可以打印原类的类名
在此,记录一下如何定义一个简单的Java编译时注解处理器
PS:附上之前的注解学习文档 —— 1. Java注解
1.1 AbstractProcessor
自定义Java编译时注解处理器,一般都是通过继承AbstractProcessor实现的
AbstractProcessor类实现了Processor接口,为自定义注解处理器提供了便利
一般的话,只需要重写process() 方法即可,其他方法按需重写
public synchronized void init(ProcessingEnvironment processingEnv)
public Set<String> getSupportedAnnotationTypes()
public SourceVersion getSupportedSourceVersion()
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)
init()方法
注解处理器都使用默认构造函数(入参和方法体都为空)进行创建,init() 方法以在注解处理器创建好后执行一些初始化工作
ProcessingEnvironment是JDK为注解处理器提供的注解处理的工具框架
通过processingEnv,可以获取注解处理中经常使用到的、有用的工具类实例,如Messager、Filer、Elements等
getSupportedAnnotationTypes()方法
在该方法中,可以指定注解处理器支持的注解,准确地说是注解的Name,如MyAnnotion.class.getCanonicalName()
AbstractProcessor的默认实现:获取类头部@SupportedAnnotationTypes注解的value,其value是一个String[];如果是没有使用@SupportedAnnotationTypes,则返回一个空的set
总结: 注解处理器支持的注解,要么在方法体里面指定,要么通过@SupportedAnnotationTypes指定
getSupportedSourceVersion()方法
在该方法中,可以指定Java源代码的版本(source version)
AbstractProcessor的默认实现:获取类头部@SupportedSourceVersion注解的value,其value是一个枚举类SourceVersion;如果是没有使用@SupportedSourceVersion,则返回SourceVersion.RELEASE_6
总结: 注解处理器支持的sourceVersion,要么该方法体中指定,要么通过@SupportedSourceVersion指定
process()方法(重头戏)
相当于注解注解器的main方法,实现对被已注册的注解标注的element(方法、类、接口等)的处理
process方法对注解的处理不是一次到位的,可能存在多个round
每次都是处理上一轮的element上标注的注解,并返回这些注解是否已经被注解处理器声明
如果返回true,后续的注解处理器将不会处理这些注解
对process()方法中声明的理解
之所以叫编译时注解处理器,是因为源代码被compiler编译成字节码前,会先扫描源代码中的注解
如果注解有对应的注解处理器,则会调用process() 方法处理被注解标注的element
这个处理过程可能会产生新的源代码、甚至修改已有的源代码,因此需要进行多轮的注解处理
自己的理解待验证,后续有空会做验证的
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h65151.shtml
- 上一篇:Redis内存满了怎么办?怎么优化?
- 下一篇:HashMap底层实现原理详解
必备CSS教程Essential CSS Tutorials
- css height
- css line-height
- css width
- css min-width
- css max-width
- css min-height
- css max-height
- css border
- css background
- css float
- css clear
- css display
- css font
- css text-transform
- css英文首字母大写
- css font-variant
- css font-weight
- css font-style
- css text-decoration
- css 删除线
- div css 虚线
- css 注释
- html 注释
- css padding
- css margin
- css 文本
- css font-size
- css font-family
- css color
- css text-align
- css text-indent
- css 超链接(css a)
- css 优化压缩
- css id(css #)
- css class(css .)
- css ul li列表
- css 圆角圆边
- css 父级子级
- css 指针概念
- css cursor
- css overflow
- html px em pt网页单位
- CSS important
- CSS position
- css z-index
- css white-space
- css img图片
- css class id
- css link与@import区别
- css 选择器
- css引入html
必备HTML基础教程Essential HTML Tutorials
- html img图片标签
- html em标签(EM强调标签)
- html strong加粗(strong标签)
- html B加粗(b加粗标签)
- strong与B加粗区别
- h1 h2 h3 h4标签(html标题标签)
- html A超链接锚文本
- html注释
- html head头部标签
- html title标题标签
- html meta标签
- html link标签
- html i斜体标签
- html u下划线标签
- html s删除线标签
- html换行br标签
- html p段落标签
- p标签与br标签区别
- html div标签元素
- html span标签
- html font标签
- html script标签
- html px em pt网页单位
- html ul li列表
- ol li列表
- dl dt dd标签组
- table tr td表格
- table tr th表格
- html form表单
- html form input
- html form textarea文本区域
- html select下拉与跳转(Html select)
- html iframe框架
- html网页结构
- htm html shtml区别用法
- 网页编码charset
- UTF-8 GBK UTF8 GB2312区别联系
- 先写html还是先写CSS
- 显示扩展名
- html标签大全集合
- html常用标签
- 网页源代码是什么