我們大致梳理下,下載的編譯期框架,都有下面這些兜畸,不全但比較有名
- Dagger2
- Room
- ARouter ------JavaPoet 生成
- ButterKnife
- EventBus ------ 傳統(tǒng)方式一行一行生成
了解APT是什么?
APT(Annotation Processing Tool)
是一種處理注釋的工具纺念,它對(duì)源代碼文件進(jìn)行檢測找出其中的Annotation渠驼,根據(jù)注解自動(dòng)生成代碼羡鸥, 如果想要自定義的注解處理器能夠正常運(yùn)行蔑穴,必須要通過APT工具來進(jìn)行處理。 也可以這樣理解惧浴,只有通過聲明APT工具后存和,程序在編譯期間自定義注解解釋器才能執(zhí)行。
通俗理解:根據(jù)規(guī)則衷旅,幫我們生成代碼捐腿、生成類文件
APT中用到的重要元素
PackageElement
表示一個(gè)包程序元素。提供對(duì)有關(guān)包及其成員的信息的訪問
ExecutableElement
表示某個(gè)類或接口的方法柿顶、構(gòu)造方法或初始化程序(靜態(tài)或?qū)嵗?
TypeElement
表示一個(gè)類或接口程序元素茄袖。提供對(duì)有關(guān)類型及其成員的信息的訪問。
VariableElement
表示一個(gè)字段嘁锯、enum 常量宪祥、方法或構(gòu)造方法參數(shù)、局部變量或異常參數(shù)
APT中用到API
屬性名 | 描述 |
---|---|
getEnclosedElements() | 返回該元素直接包含的子元素 |
getEnclosingElement() | 返回包含該element的父element家乘,與上一個(gè)方法相反 |
getKind() | 返回element的類型蝗羊,判斷是哪種element |
getModifiers() | 獲取修飾關(guān)鍵字,入public static final等關(guān)鍵字 |
getSimpleName() | 獲取名字,不帶包名 |
getQualifiedName() | 獲取全名仁锯,如果是類的話耀找,包含完整的包名路徑 |
getParameters() | 獲取方法的參數(shù)元素,每個(gè)元素是一個(gè)VariableElement |
getReturnType() | 獲取方法元素的返回值 |
getConstantValue() | 如果屬性變量被final修飾业崖,則可以使用該方法獲取它的值 |
工作原理
APT 編譯的時(shí)候 ---> 處理注解
APT 傳統(tǒng)方式 ---> 生成 java文件
APT JavaPoet方式 --> 生成Java文件
傳統(tǒng)方式 那些 開源項(xiàng)目有用到?
類似EventBus源碼就知道了
傳統(tǒng)方式:優(yōu)點(diǎn)(編程的流程寫下去) 缺點(diǎn)(沒有oop思想加入進(jìn)來)
JavaPoet是什么?
JavaPoet是square推出的開源java代碼生成框架野芒,提供Java Api生成.java源文件 這個(gè)框架功能非常實(shí)用,也是我們習(xí)慣的Java面向?qū)ο驩OP語法 可以很方便的使用它根據(jù)注解生成對(duì)應(yīng)代碼
通過這種自動(dòng)化生成代碼的方式腻要, 可以讓我們用更加簡潔優(yōu)雅的方式要替代繁瑣冗雜的重復(fù)工作
項(xiàng)目主頁及源碼:https://github.com/square/javapoet
JavaPoet相關(guān)API
類對(duì)象 | 說明 |
---|---|
MethodSpec | 代表一個(gè)構(gòu)造函數(shù)或方法聲明 |
TypeSpec | 代表一個(gè)類复罐,接口,或者枚舉聲明 |
FieldSpec | 代表一個(gè)成員變量雄家,一個(gè)字段聲明 |
JavaFile | 包含一個(gè)頂級(jí)類的Java文件 |
ParameterSpec | 用來創(chuàng)建參數(shù) |
AnnotationSpec | 用來創(chuàng)建注解 |
ClassName | 用來包裝一個(gè)類 |
TypeName | 類型效诅,如在添加返回值類型是使用 TypeName.VOID |
$S 字符串,如:$S, ”hello”, | |
$T 類趟济、接口乱投,如:$T, MainActivity |
JavaPoet到底是什么?
oop思想方式:優(yōu)點(diǎn)(加入oop思想) 缺點(diǎn)(不習(xí)慣,倒序)
JavaPoet真的比傳統(tǒng)方式好嗎?
并不是這樣的顷编,如果復(fù)雜的代碼生成戚炫,反而效率低下.發(fā)展趨勢,oop思想媳纬,真正的掌握J(rèn)avaPoet双肤,非常受用
看下一般的模塊思路
arouter-annotation
存放所有的注解
arouter-compiler
注解處理器施掏,APT。服務(wù)茅糜,盯著整個(gè)項(xiàng)目七芭,如果你在編譯,我就知道