ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

Java注解 把玩Java注解处理(1/3)

来源:网络整理     时间:2016-06-20     关键词:Java注解

本篇文章主要介绍了"Java注解 把玩Java注解处理",主要涉及到Java注解方面的内容,对于Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: 原文链接:http://programmaticallyspeaking.com/playing-with-java-annotation-processing...

原文链接:http://programmaticallyspeaking.com/playing-with-java-annotation-processing.html

我通过Tweet发现了Lombok项目,并且当我看到一个注解就可以在源码编译时透明的触发代码自动生成,这肯定有什么技巧。他们是怎么做到的呢?

一番探索之后,我发现了Java的注解处理API,以及如何使用SPI(Service Provider Interface)在编译时透明的调用注解处理器。这里是处理流程:

首先,我们创建一个简单的注解类型(忽略包名和引入):

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

使用@Retention注解,我们指定超过编译时间后不处理这类型的注解,所以编译器可以放弃他们。

接着,我们创建一个注解处理器,它会打印那些使用@PrintMe注解的元素。我们可以继承自AbstractProcessor类。使用@SupportedAnnotationTypes注解,指定要处理的注解:

@SupportedAnnotationTypes(
  {"com.programmaticallyspeaking.aptdemo.PrintMe"}
)
publicclassAnnotationProcessorextendsAbstractProcessor {

要实现的主要方法是process:

publicbooleanprocess(Set annotations,
                         RoundEnvironment env) {

我们获取当前的Messager实例使得能够打印消息:

Messager messager = processingEnv.getMessager();

接着遍历注解(这里只有一个注解,所以代码比它需要的更通用),以及由它们注解的元素:

for (TypeElement te : annotations) {
      for (Element e : env.getElementsAnnotatedWith(te)) {

这里,我们可以做很多有趣的是,但是现在,我们只打印每个被注解元素:

messager.printMessage(Diagnostic.Kind.NOTE,
                                 "Printing: " + e.toString());

最后,我们括起来并返回true来声明处理的注解,这样没有其他注解可以使用它们:

      }
    }
    returntrue;
  }

为了避免在注解处理器执行时有于代码版本的警告,我们指定处理当前执行环境支持的最新代码版本:

Java注解相关图片

Java注解相关文章