Annotations Processing
概念
Annotation processing-javac在編譯時掃描铃在、處理Annotation的工具。對于特定的注解可以注冊對應(yīng)的annotation processor。
特定注解的注解處理器以java code作為輸入.java文件作為輸出。可以理解成在編譯時生成想要的.java文件绝淡,生成的.java文件和其他手寫的.java文件一樣會被javac編譯。
NOTE:僅僅是生成苍姜,注解處理器并不能修改已經(jīng)存在的對象牢酵,比如增加一個方法
AbstractProcessor
自定義Processor需要繼承java內(nèi)置的AbstractProcessor,比較重要的幾個方法如下
package com.wsl;
public class MyProcessor extends AbstractProcessor {
@Override
public synchronized void init(ProcessingEnvironment env){ }
@Override
public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { }
@Override
public Set<String> getSupportedAnnotationTypes() { }
@Override
public SourceVersion getSupportedSourceVersion() { }
}
- init(ProcessingEnvironment env): 每個annotation processor class必須有一個空構(gòu)造函數(shù)。init()方法被注解處理器調(diào)用衙猪,ProcessingEnvironment 參數(shù)提供了一些很有用的工具類馍乙,比如Elements、Types和Filer垫释,稍后會用到丝格。
- process(Set<? extends TypeElement> annotations, RoundEnvironment env):每個注解處理器最主要的方法,生成java文件的邏輯就是在這里完成的棵譬。RoundEnvironment 參數(shù)可以查詢被注解過的元素显蝌。
- getSupportedAnnotationTypes(): 注解處理器注冊對應(yīng)的Annotations
- getSupportedSourceVersion(): 指定java version,一般情況下 return SourceVersion.latestSupported()即可,或者也可以return其他版本,比如SourceVersion.RELEASE_6.
如果java7以上版本可以用@SupportedSourceVersion订咸、@SupportedAnnotationTypes代替getSupportedAnnotationTypes() 和 getSupportedSourceVersion()
@SupportedSourceVersion(SourceVersion.latestSupported())
@SupportedAnnotationTypes({
// Set of full qullified annotation type names
})
public class MyProcessor extends AbstractProcessor {
@Override
public synchronized void init(ProcessingEnvironment env){ }
@Override
public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { }
}
NOTE: 考慮到編譯的兼容性問題(特別是Android)曼尊,推薦重載getSupportedAnnotationTypes() 和 getSupportedSourceVersion()
Annotation Processor運(yùn)行在自己的jvm里,javac會開啟一個jvm來運(yùn)行注解處理器脏嚷,這就意味著可以添加一些第三方依賴庫骆撇,比如guava
Register Processor
需要提供一個jar,jar包括MyProcessor和javax.annotation.processing.Processor,如下:
MyProcessor.jar
- com
- example
- MyProcessor.class
- META-INF
- services
- javax.annotation.processing.Processor
javax.annotation.processing.Processor的作用是告訴javac用到了哪些Processor父叙,如下
com.example.MyProcessor
com.foo.OtherProcessor
net.blabla.SpecialProcessor
可把MyProcessor.jar當(dāng)作第三方Library來使用即可