博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Annotation实战【自定义AbstractProcessor】
阅读量:7293 次
发布时间:2019-06-30

本文共 3087 字,大约阅读时间需要 10 分钟。

前言

在使用Java的过程中,每个开发人员都接触过@Override, @Deprecated等等各式各样的注解,这些东西是java最基础的一些原生定义好的annotation。本文通过一个实例演示如果自定义自己的annotation,使得在编译源码代码阶段进行额外操作。

预热

简单说一下annotation的基本知识,从java的官方技术文档可以直接找到annotation的技术点。

Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.

Annotations是一种元数据,其作用在于提供程序本身以外的一些数据信息,也就是说Annotation他不会属于程序代码本身,不参与逻辑运算,故而不会对原程序代码的操作产生直接的影响。

一般来说Annotation有如下三种使用情形:

  • Information for the compiler — Annotations can be used by the compiler to detect errors or suppress * warnings.
  • Compile-time and deployment-time processing — Software tools can process annotation information to generate code, XML files, and so forth.
  • Runtime processing — Some annotations are available to be examined at runtime.
  • 为编译器提供辅助信息 — Annotations可以为编译器提供而外信息,以便于检测错误,抑制警告等.
  • 编译源代码时进行而外操作 — 软件工具可以通过处理Annotation信息来生成原代码,xml文件等等.
  • 运行时处理 — 有一些annotation甚至可以在程序运行时被检测,使用.

具体annotation的详细知识点可以参考技术文档,本文案例针对的是编译源代码时进行而外操作

目标

用过顶顶大名的Dagger,Butterknife等依赖注入的童鞋可能知道,他们就通过运行时annotation预处理技术实现动态的生成代码。现在我们先做一个简单的案例:

通过定义一个annotation,在编译代码的时候,凡是用该annotation声明过的类,方法,我们都要在控制台输出他们的信息

下文涉及的编码等工作是基于IntelliJ Idea和Android Studio,读者也可以根据自己的实际情况选用其他诸如Eclipse的工具。

开工

首先用IntelliJ新建一个java标准工程,同时勾选maven支持,我们需要新建一个自己的AbstractProcessor类, 其中process为主要方法,在里面处理接收到的所有被PrintMe修饰过的元素,这里是直接输出器信息。

@SupportedAnnotationTypes({"com.avenwu.annotation.PrintMe"})public class MyProcessor extends AbstractProcessor {    public boolean process(Set
annotations, RoundEnvironment env) { Messager messager = processingEnv.getMessager(); for (TypeElement te : annotations) { for (Element e : env.getElementsAnnotatedWith(te)) { messager.printMessage(Diagnostic.Kind.NOTE, "Printing: " + e.toString()); } } return true; } @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latestSupported(); }}

现在新建PrintMe,简单起见现在可以什么不写,仅需标注其使用策略为RetentionPolicy.SOURCE

@Retention(RetentionPolicy.SOURCE)public @interface PrintMe {}

现在我们需要生成jar文件,修改pom.xml,默认生成的pom.xml需要再添加jar,和maven-compiler-plugin,修改完毕后应该如下:

4.0.0
groupId
AnnotationProcessorTest
1.0-SNAPSHOT
jar
maven-compiler-plugin
2.3.2
1.6
1.6
-proc:none

为了我们的AbstractProcessor内被使用,需要在META-INF中显示标识,在resources资源文件夹下新建META-INF/services/javax.annotation.processing.Processor

com.avenwu.annotation.MyProcessor

至此可以build生成jar了。

Project Structure

同时我们可以看一下生成的jar里面都有什么东西:

Project Structure

测试

现在我们需要测试一下生成的jar包是不是如预期能输出信息。将AnnotationProcessorTest.jar拷贝置一个测试项目的libs,然后在任意选择几个位置用PrintMe修饰:

Project Structure
Project Structure

现在编译测试项目,在输出console了面观察日志

Project Structure

参考

转载于:https://www.cnblogs.com/avenwu/p/4173899.html

你可能感兴趣的文章
演示数据块整理(合并)的效果
查看>>
Android bluetooth用户自定义数据
查看>>
欧拉函数的一道练习题(附加容斥做法)
查看>>
初级运维工程师面试题总结
查看>>
Python 学习笔记10 函数
查看>>
今日已矣,明日可期
查看>>
Java新知识系列 七
查看>>
TEXT文本编辑框2
查看>>
hdu 1142 最短路+记忆化
查看>>
看过《大湿教我写.net通用权限框架(1)之菜单导航篇》之后发生的事(续)——主界面...
查看>>
HttpRuntime应用程序的运行时
查看>>
在unity3d中使用opencv
查看>>
php格式化时间
查看>>
写文件类
查看>>
使用dispatch_once创建单例
查看>>
「postgre」INT最大值
查看>>
一个很简单小数正负数行转列问题
查看>>
vue组件的3种书写形式
查看>>
<meta>标签
查看>>
MySql 显示表结构信息.
查看>>