Android 中的APT
一稠肘、什么是APT
APT(Annotation Processing Tool 的簡(jiǎn)稱)摊趾,可以在代碼編譯期解析注解泪掀,并且生成新的 Java 文件负懦,減少手動(dòng)的代碼輸入∨憬荩現(xiàn)在有很多主流庫都用上了 APT踩窖,比如 Dagger2, ButterKnife, EventBus3 等
? ? ? ? ? ? 本文通過實(shí)現(xiàn)簡(jiǎn)單的ButterKnife控件綁定介紹APT的內(nèi)容
二乓诽、AbstractProcessor
? ? ? ? 在編譯時(shí)編譯器會(huì)檢查AbstractProcessor的子類帜羊,并且調(diào)用該類型的過程函數(shù),然后將添加了注解的所有元素都傳遞到處理函數(shù)中鸠天,使得開發(fā)人員可以在編譯器進(jìn)行相應(yīng)的處理讼育,例如,根據(jù)注解生成新的的Java類稠集,這也就是ButterKnife奶段,改造,牽引等開源庫的基本原理剥纷。Java的API已經(jīng)提供了掃描源碼并解析注解的框架痹籍,我們可以繼承AbstractProcessor類來提供實(shí)現(xiàn)自己的解析注解邏輯。
如何使用Processor
? ? 1.新建java-libreary才可以使用Processor哦
? ? ? ? // 自動(dòng)注冊(cè)processor的類庫谷歌出品
? ? ? ? implementation'com.google.auto.service:auto-service:1.0-rc2'
? ? ? ? //javapoet? 生成java代碼的類庫
? ? ? ? implementation'com.squareup:javapoet:1.7.0'
2.在項(xiàng)目中引入processor
annotationProcessor project(':java工程')
annotationProcessor是APT工具中的一種晦鞋,他是google開發(fā)的內(nèi)置框架蹲缠,不需要引入,可以直接在build.gradle文件中使用悠垛,如下
創(chuàng)建一個(gè)Processor類繼承AbstractProcessor
process 方法會(huì)在編譯時(shí)被調(diào)用线定,set集合存放著所有被@SupportedAnnotationTypes()標(biāo)記的注解的Element(例如:所有被BundView注解的View的信息包括全類名,父Element這這里為activity)确买;
processElement處理element 保存所有activity 和 view的信息
createJavaFile 通過javapoet庫就會(huì)在build->generated->source->apt目錄下生產(chǎn)java文件
ButterKnife的bund方法就是通過類全名+_BundleView反射獲取類對(duì)象實(shí)例化
使用方法
不要在意報(bào)紅的地方斤讥,編譯器問題。是不是和ButterKnife很相似的湾趾,其實(shí)ButterKnife也是這個(gè)原理芭商,當(dāng)然他的更加復(fù)雜派草。我這里只是簡(jiǎn)單的實(shí)現(xiàn),讓大家對(duì)APT技術(shù)有個(gè)了解铛楣,具體的還需要大家繼續(xù)努力學(xué)習(xí)近迁。
越努力越幸運(yùn),大家共勉