您好、欢迎来到现金彩票网!
当前位置:秒速快3官网 > 数组处理器 >

自定义Java注解处理器

发布时间:2019-06-07 05:46 来源:未知 编辑:admin

  本文介绍了如何自定义Java注解处理器及涉及到的相关知识,看完本文可以很轻松看懂并理解各大开源框架的注解处理器的应用。

  实现一个自定义注解处理器需要有两个步骤,第一是实现Processor接口处理注解,第二是注册注解处理器。

  通过实现Processor接口可以自定义注解处理器,这里我们采用更简单的方法通过继承AbstractProcessor类实现自定义注解处理器。实现抽象方法process处理我们想要的功能。

  最后我们还需要将我们自定义的注解处理器进行注册。新建res文件夹,目录下新建META-INF文件夹,目录下新建services文件夹,目录下新建javax.annotation.processing.Processor文件,然后将我们自定义注解处理器的全类名写到此文件:

  上面这种注册的方式太麻烦了,谷歌帮我们写了一个注解处理器来生成这个文件。

  搞定,体会到注解处理器的强大木有。后面我们只需关注注解处理器中的处理逻辑即可。

  抽象类中还有一个init方法,这是Processor接口中提供的一个方法,当我们编译程序时注解处理器工具会调用此方法并且提供实现ProcessingEnvironment接口的对象作为参数。

  我们可以使用ProcessingEnvironment获取一些实用类以及获取选项参数等:

  Element元素是一个接口,表示一个程序元素,比如包、类或者方法。以下元素类型接口全部继承自Element接口:

  如果我们要判断一个元素的类型,应该使用Element.getKind()方法配合ElementKind枚举类进行判断。尽量避免使用instanceof进行判断,因为比如TypeElement既表示类又表示一个接口,这样判断的结果可能不是你想要的。例如我们判断一个元素是不是一个类:

  下表为ElementKind枚举类中的部分常量,详细信息请查看官方文档。

  TypeMirror是一个接口,表示 Java 编程语言中的类型。这些类型包括基本类型、声明类型(类和接口类型)、数组类型、类型变量和 null 类型。还可以表示通配符类型参数、executable 的签名和返回类型,以及对应于包和关键字 void 的伪类型。以下类型接口全部继承自TypeMirror接口:

  表示一个数组类型。多维数组类型被表示为组件类型也是数组类型的数组类型。

  表示某一声明类型,是一个类 (class) 类型或接口 (interface) 类型。这包括参数化的类型(比如 java.util.SetString)和原始类型。TypeElement 表示一个类或接口元素,而 DeclaredType 表示一个类或接口类型,后者将成为前者的一种使用(或调用)。

  表示 executable 的类型。executable 是一个方法、构造方法或初始化程序。

  表示一个基本类型。这些类型包括 boolean、byte、short、int、long、char、float 和 double。

  表示一个引用类型。这些类型包括类和接口类型、数组类型、类型变量和 null 类型。

  Filer接口支持通过注解处理器创建新文件。可以创建三种文件类型:源文件、类文件和辅助资源文件。

  创建一个新的源文件,并返回一个对象以允许写入它。文件的名称和路径(相对于源文件的根目录输出位置)基于该文件中声明的类型。如果声明的类型不止一个,则应该使用主要顶层类型的名称(例如,声明为 public 的那个)。还可以创建源文件来保存有关某个包的信息,包括包注解。要为指定包创建源文件,可以用 name 作为包名称,后跟 .package-info;要为未指定的包创建源文件,可以使用 package-info。

  创建一个新的类文件,并返回一个对象以允许写入它。文件的名称和路径(相对于类文件的根目录输出位置)基于将写入的类型名称。还可以创建类文件来保存有关某个包的信息,包括包注解。要为指定包创建类文件,可以用 name 作为包名称,后跟 .package-info;为未指定的包创建类文件不受支持。

  创建一个用于写入操作的新辅助资源文件,并为它返回一个文件对象。该文件可以与新创建的源文件、新创建的二进制文件或者其他受支持的位置一起被查找。位置 CLASS_OUTPUT 和 SOURCE_OUTPUT 必须受支持。资源可以是相对于某个包(该包是源文件和类文件)指定的,并通过相对路径名从中取出。从不太严格的角度说,新文件的完全路径名将是 location、 pkg 和 relativeName 的串联。

  对于生成Java文件,还可以使用Square公司的开源类库JavaPoet,感兴趣的同学可以了解下。

  Messager接口提供注解处理器用来报告错误消息、警告和其他通知的方式。

  注意:我们应该对在处理过程中可能发生的异常进行捕获,通过Messager接口提供的方法通知用户。此外,使用带有Element参数的方法连接到出错的元素,用户可以直接点击错误信息跳到出错源文件的相应行。如果你在process()中抛出一个异常,那么运行注解处理器的JVM将会崩溃(就像其他Java应用一样),这样用户会从javac中得到一个非常难懂出错信息。

  我们可以通过getOptions()方法获取选项参数,在gradle文件中配置选项参数值。例如我们配置了一个名为yuweiguoCustomAnnotation的参数值。

  在注解处理器中重写getSupportedOptions方法指定支持的选项参数名称。通过getOptions方法获取选项参数值。

  Java官方文档给出的注解处理过程的定义:注解处理过程是一个有序的循环过程。在每次循环中,一个处理器可能被要求去处理那些在上一次循环中产生的源文件和类文件中的注解。第一次循环的输入是运行此工具的初始输入。这些初始输入,可以看成是虚拟的第0次的循环的输出。这也就是说我们实现的process方法有可能会被调用多次,因为我们生成的文件也有可能会包含相应的注解。例如,我们的源文件为SourceActivity.class,生成的文件为Generated.class,这样就会有三次循环,第一次输入为SourceActivity.class,输出为Generated.class;第二次输入为Generated.class,输出并没有产生新文件;第三次输入为空,输出为空。

  每次循环都会调用process方法,process方法提供了两个参数,第一个是我们请求处理注解类型的集合(也就是我们通过重写getSupportedAnnotationTypes方法所指定的注解类型),第二个是有关当前和上一次 循环的信息的环境。返回值表示这些注解是否由此 Processor 声明,如果返回 true,则这些注解已声明并且不要求后续 Processor 处理它们;如果返回 false,则这些注解未声明并且可能要求后续 Processor 处理它们。

  了解完了相关的基本概念,接下来我们来看一个示例,本示例只为演示无实际意义。主要功能为自定义一个注解,此注解只能用在public的方法上,我们通过注解处理器拿到类名和方法名存储到List集合中,然后生成通过参数选项指定的文件,通过此文件可以获取List集合。

  关于上传自定义注解处理器到jcenter中,请查看上传类库到jcenter。

  很高兴你能阅读到这里,此时再去看EventBus 3.0中的注解处理器的源码,相信你可以很轻松地理解它的原理。

  注意:如果你clone了工程代码,你可能会发现注解和注解处理器是单独的module。有一点可以肯定的是我们的注解处理器只需要在编译的时候使用,并不需要打包到APK中。因此为了用户考虑,我们需要将注解处理器分离为单独的module。

  Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...

  Java 中的注解(Annotation) 是一个很方便的特性在Spring当中得到了大量的应用 , 我们也可以开发自己的注解来提高我们的开发效率之前自己开发过很多运行时通过反射机制完成的注解 ,这一次在学习SpringBoot源码时了解到了编译时处理的注解以下内容 转自 ...

  你看你看,石榴红了。 你看你看,樱桃熟了,能没人摘吗? 鼻子嗅出山林的秋到了,雉鸡焉能逃脱狐狸的怀抱!!! 冬雪了,谁能躲过上苍的妖娆!!!??? 你听你听,春融冰雪的声音。 你听你听,夏蝉秋虫的呢喃。 天籁之声细到极致/美到毫巅了吗!!! 卧听海涛/醉眺银河不敢听星星碰撞...

  《东北亚日记》 萨德将上马, 槿惠弹下台。 三肥玩热火, 万瘦饥冷柴。 九亲认皆否, 六方谈不来。 半岛剧惊演, 全球眼大开。 20170311

  (1) 一位来自河北石家庄的小伙伴留言说:他在最没有能力的年纪,遇见了最想照顾一生的人,他没有能力让女孩过上好的生活。可女孩心甘情愿跟着他,但他实在没有勇气,也不忍心让女孩跟着他吃苦,他希望女孩能找到一个更好的人去依靠。后来,后来忍痛断了联系。 他说: 其实自己的内心比谁都...

  这三天,我在山东学习,此次来山东主要学习交流青少年思维导图方向的教学模式,思维导图在台湾青少年教学中已是成熟模式,山东省引进了台湾的思维导图教学法,并准备在全省力学生中推思维导图的学习。 提前来到酒店,和台湾孙易新老师面谈,孙老师是个学者派的作风,他谈到学习思维导图...

http://alsunah.net/shuzuchuliqi/188.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有