注解處理器配置以及使用

  • 配置
// As-3.4.1及其以上 + gradle5.1.1-all + auto-service:1.0-rc4
api 'com.google.auto.service:auto-service:1.0-rc4'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc4'

java項目避免輸出亂碼奋姿,增加配置

// java控制臺輸出中文亂碼
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}
  • 繼承AbstractProcessor,重寫init和實現(xiàn)process方法
  • 增加@AutoService(Processor.class)注解
  • 配置注解
    • SupportedAnnotationTypes 設置要處理的注解類型
    • SupportedSourceVersion 設置jdk編譯版本
    • SupportedOptions 設置接收的參數(shù)
  • 從init方法中初始化基本工具類實例
// 初始化
/*操作Element的工具類(類梳猪,函數(shù),屬性蒸痹,都屬于Element)*/
elementUtils = processingEnvironment.getElementUtils();
/*類類型工具春弥,用于操作TypeMirror的工具類*/
typeUtils = processingEnvironment.getTypeUtils();
/*用于打印日志*/
messager = processingEnvironment.getMessager();
/*用于生成文件*/
filer = processingEnvironment.getFiler();

//獲取參數(shù),傳遞參數(shù)后文介紹
Map<String, String> options = processingEnv.getOptions();
if (options.size() == 0 || !options.containsKey("eventBusIndex")) {
    messager.printMessage(Diagnostic.Kind.NOTE, "需要傳遞一個類索引類的全類名");
    return;
}
eventBusIndexClassName = options.get("eventBusIndex");
  • 在process方法中處理Element

    • roundEnv.getElementsAnnotatedWith(Subscribe.class) 獲取Subscribe注解的所有元素
    • element.getKind() 獲取該元素類型叠荠,是類匿沛,函數(shù)或者字段等
    • element.getModifiers() 獲取修飾符
    • executableElement.getReturnType() 獲取返回值
    • executableElement.getParameters() 獲取參數(shù)
    • executableElement.getEnclosingElement() 獲取該函數(shù)的所屬的類元素

    executableElement表示這是一個可執(zhí)行的元素即方法

    • elementUtils.getTypeElement("全類名") 根據(jù)字符串獲取類的類型用于javapoet自動生成文件的類型
    • TypeName 某個屬性或者參數(shù)的類型,一般的可以使用ClassName.get獲取榛鼎,可傳遞class逃呼,TypeElement,TypeMirror等者娱,復合型的類型抡笼,例如含有泛型的可以使用ParameterizedTypeName.get獲取,例如Map<T1,T2>黄鳍,第一個參數(shù)就傳遞ClassName.get(Map.class)推姻,T1,T2依次傳遞即可框沟。
    • 生成一個類藏古,應該用倒序的方式去寫,先把類的結構搭建起忍燥,然后需要什么再添加什么拧晕,例如:

    JavaFile.builder(packageName, typeSpec).build().writeTo(filer);
    這就是生成一個類的方法,但是這里需要傳入報名和TypeSpec灾前,所以就去創(chuàng)建一個typeSpec防症,這是一個類結構的封裝對象。

    TypeSpec typeSpec = TypeSpec.classBuilder(className).build()
    這句話就能生成一個類結構的封裝對象,className就是類名蔫敲,然后我們可以通過TypeSpec的builder去添加很多關于類的所有東西饲嗽,最后再build:

    • 實現(xiàn)一個接口使用addSuperinterface或者繼承一個類使用superclass當然都需要傳遞接口或者要繼承的類的類型
    • 同樣可以添加類的修飾符addModifiers,可傳遞多個
    • 可以添加字段addField奈嘿,添加的字段可以創(chuàng)建一個FieldType貌虾,需要字段名,類型以及修飾符裙犹,例如:
    FieldSpec.builder(/*字段類型,參考上文的TypeName*/fieldType,
     /*字段名*/"info",
     /*修飾符*/ Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
     .build();
    
    • 靜態(tài)代碼塊addStaticBlock尽狠,可以創(chuàng)建一個CodeBlock.builder(),然后內部的每一行代碼都可以通過add添加叶圃,但是需要注意袄膏,使用add添加的代碼不會自動添加分號
    • 添加方法addMethod,可以創(chuàng)建一個 MethodSpec.methodBuilder("方法名")來添加掺冠,可以添加方法修飾符(addModifiers)沉馆,方法參數(shù)(addParameter),方法返回值(returns)德崭,方法體(addStatement或者addCode斥黑,前者每句結尾會自動添加分號,后者不會)眉厨。
    • 然后在添加的過程中還有一個重要的知識點就是format的占位符

    $N 用來表示變量名

    $S 用來表示字符串

    $T 用來表示類

    $L 用來表示枚舉的值

    然后每一個占位符都需要一個值來填充锌奴,例如要生成info = new HashMap<Class<?>, String>();這樣一句話就可以:

    addStatement(/*format*/"$N = new $T<$T, $T>()"
    /*對應值*/ "info",ClassName.get(HashMap.class),
    ClassName.get(Class.class),ClassName.get(String.class)
    )
    

    這樣生成出來就是上邊那句話了,$N$S的傳值都是字符串憾股,顯示出來前者會去掉引號變成一個變量鹿蜀,后者就是字符串顯示。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末荔燎,一起剝皮案震驚了整個濱河市耻姥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌有咨,老刑警劉巖琐簇,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異座享,居然都是意外死亡婉商,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門渣叛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丈秩,“玉大人,你說我怎么就攤上這事淳衙∧⒒啵” “怎么了饺著?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肠牲。 經常有香客問我幼衰,道長,這世上最難降的妖魔是什么缀雳? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任渡嚣,我火速辦了婚禮,結果婚禮上肥印,老公的妹妹穿的比我還像新娘识椰。我一直安慰自己,他們只是感情好深碱,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布腹鹉。 她就那樣靜靜地躺著,像睡著了一般莹痢。 火紅的嫁衣襯著肌膚如雪种蘸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天竞膳,我揣著相機與錄音,去河邊找鬼诫硕。 笑死坦辟,一個胖子當著我的面吹牛,可吹牛的內容都是我干的章办。 我是一名探鬼主播锉走,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼藕届!你這毒婦竟也來了挪蹭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤休偶,失蹤者是張志新(化名)和其女友劉穎梁厉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踏兜,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡词顾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碱妆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肉盹。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疹尾,靈堂內的尸體忽然破棺而出上忍,到底是詐尸還是另有隱情骤肛,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布窍蓝,位于F島的核電站萌衬,受9級特大地震影響,放射性物質發(fā)生泄漏它抱。R本人自食惡果不足惜秕豫,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望观蓄。 院中可真熱鬧混移,春花似錦、人聲如沸侮穿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亲茅。三九已至回铛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間克锣,已是汗流浹背茵肃。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袭祟,地道東北人验残。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像巾乳,于是被迫代替她去往敵國和親您没。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容