成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

安卓to鴻蒙系列:ButterKnife(一)

系統
文章由鴻蒙社區(qū)產出,想要了解更多內容請前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術社區(qū)https://harmonyos.51cto.com

[[398862]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

本文是關于ButterKnife的移植的第一篇:

先介紹基礎知識,理解apt是什么,最終輸出一個乞丐版BufferKnife注入工具。

這是讀懂BufferKnife源碼的基礎。

第二篇占坑:具體講解BufferKnife的移植。

基礎知識

apt技術的實際應用:

  • Android Databinding綁定view
  • ButterKnife綁定view
  • Dagger2注入變量
  • ARouter生成路由表

真的好多,很重要。apt就是生產力工具!

什么是apt?

通俗講:apt就是javac對外開放的一個插件,使javac在編譯期間獲取注解(Annotation),并做出相應的處理(多數都是生成一些java代碼)。

從上圖可以看出apt處理的是 java源文件 ,在編譯期介入。

與之對比的是asm之類的工具,處理的是字節(jié)碼文件,在編譯后期介入。

apt與javac的約定

apt與javac約定在META-INF/services/javax.annotation.processing.Processor文件中注冊apt插件。這樣apt就參與到javac的編譯過程中了。

寫一個乞丐版BufferKnife

不想看文字,直接看源碼,點擊 https://gitee.com/andych008/aptDemo

初始代碼fork自 https://github.com/LiMubai2017/aptDemo ,先對作者表示感謝。

乞丐版BufferKnife作為一款view注入工具,主要干了3件事,

解析注解

處理注解(生成模板類文件)

通過模板類注入view對象

第0步:準備工作

先定義注解BindView,被@BindView標記的變量會被注入。

一般注解都定義在一個單獨的module(如取名apt-annotation),因為它會被apt-compiler和apt-api都依賴,屬于公共代碼。

apt-compiler是apt的主要代碼所在,完成注解的解析、模板文件的生成。

apt-api則是對外的工具類,供用戶使用,完成注入操作。

app是demo,其中定義了

  1. @BindView(value = ResourceTable.Id_text_helloworld) 
  2. public Text testTextView; 

 第一步:解析注解

在apt-compiler中定義類BindViewProcessor繼承javax.annotation.processing.AbstractProcessor,實現其中的getSupportedAnnotationTypes()該方法注冊要解析的注解。

第二步:處理注解(生成模板文件)

在BindViewProcessor中實現process()方法,處理注解。

先理解javax.lang.model.element.Element和javax.lang.model.type.TypeMirror,參考這里 有詳細的解釋。

  • 簡單講:
  • Element是描述java語言元素的類,比如包、類、變量、參數等。
  • TypeMirror是描述Element類型的類,比如各種基本類型、數組、類等。

很繞,只有多用才能真正理解。比如:demo中testTextView就是VariableElement元素類型

  1. TypeElement enclosingElement = (TypeElement) variableElement.getEnclosingElement();//獲取代表MainAbility的TypeElement 
  2.  
  3. String field = variableElement.getSimpleName().toString();//testTextView 
  4. TypeMirror typeMirror = variableElement.asType();//ohos.agp.components.Text 

 通過log()方法,可以使用Messager打日志,驗證我們的理解。

  1. log(String.format("element : (%s) %s ", element.getKind(), element)); 
  2. log(String.format("bind : (%s) %s <--> id = %d", typeMirror, field, id)); 
  3. 輸出日志: 
  4. 注: element : (FIELD) testTextView  
  5. 注: bind : (ohos.agp.components.Text) testTextView <--> id = 16777222 

 generateCodeByPoet()方法中,使用javapoet生成模板代碼MainAbility$$Autobind.java(文件路徑app/build/generated/source/annotation/debug/com/example/apt_demo/MainAbility$$Autobind.java)

關于javapoet的使用,直接看官方文檔吧:https://github.com/square/javapoet

解釋一下下面這段代碼,讓大家對javapoet有一直觀的認識

  1. MethodSpec.Builder injectMethod = MethodSpec.methodBuilder("inject")//生成一個方法,方法名是inject 
  2.         .addAnnotation(Override.class)//給方法加上"Override.class"注解 
  3.         .addModifiers(Modifier.PUBLIC)//給方法加上訪問控制符 
  4.         .addParameter(Object.class, "target")//給方法加上參數 
  5.         .addStatement("$T substitute = ($T)target", className, className);//在方法體內定義一條語名 

 上面的代碼生成下面的代碼(我用java代碼生成java代碼,這就是javapoet干的事情):

  1. @Override 
  2. public void inject(Object target) { 
  3.   MainAbility substitute = (MainAbility)target; 

 看完上面這一坨,你如果覺得難。請用JavaWriter生成java文件。你就會覺得javapoet真香。

第三步:通過模板類注入view對象

在apt-api中,我們定義一個AutoBind.java類封裝對模板類MainAbility$$Autobind.java的操作。

按照模板類的命名規(guī)則xxx$$Autobind,通過反射實例化出MainAbility$$Autobind.java,調用 其中的inject方法,完成view的注入。

總結

apt只是一個工具,在這套工具框架下,怎么處理注解才是難點。

BufferKnife和我們的“乞丐版BufferKnife”本質上沒有區(qū)別。除了注入view,還支持事件綁定、增量編譯。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關推薦

2021-07-26 10:09:43

鴻蒙HarmonyOS應用

2021-04-26 09:46:10

鴻蒙HarmonyOS應用

2021-04-27 09:22:28

鴻蒙HarmonyOS應用

2019-06-20 16:07:12

鴻蒙安卓操作系統

2013-12-12 16:23:53

安卓進化AndroidGoogle

2020-09-10 09:30:03

鴻蒙安卓操作系統

2016-12-14 14:43:11

ButterknifeAndroid

2021-10-26 06:59:40

Windows 11操作系統微軟

2016-12-28 09:30:37

Andriod安卓平臺依賴注入

2021-05-20 05:27:50

安卓系統應用安卓12

2011-11-23 09:57:28

安卓驅動

2013-09-11 09:43:06

蘋果安卓

2013-11-04 14:49:34

安卓

2018-02-09 08:59:47

安卓FuchsiaiOS

2018-05-09 10:39:21

Google安卓 系操作系統

2019-07-12 16:00:25

華為禁令開發(fā)

2021-05-18 15:44:13

IOS安卓鴻蒙

2021-06-04 05:13:22

鴻蒙

2013-10-17 10:17:41

安卓

2014-12-09 11:15:06

郵箱安卓移動端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91一区二区在线观看 | 老头搡老女人毛片视频在线看 | 国产成人a亚洲精品 | 亚洲三区在线观看 | 亚洲欧美综合精品久久成人 | 国产不卡在线观看 | 夜久久 | 国产精品99久久久久久大便 | 成人精品在线观看 | 综合精品 | 亚洲社区在线 | 91亚洲国产成人久久精品网站 | 久久综合久久久 | 九九亚洲 | 日韩国产一区二区三区 | 久久国产精品视频 | av网址在线 | 日韩欧美视频免费在线观看 | 日本粉嫩一区二区三区视频 | 亚洲天堂精品久久 | 91久久精品日日躁夜夜躁国产 | 精品久久久久香蕉网 | 国产精品一区二区三区在线 | 国产精品久久久久久久久久 | www.99精品 | 狠狠爱一区二区三区 | 国产激情一区二区三区 | www视频在线观看 | 国产精品日韩在线观看 | 亚洲成av人片在线观看无码 | 国产视频导航 | 性xxxxx| 一区二区免费看 | 国产高清在线视频 | 久久久久国产一区二区 | 精品国产免费人成在线观看 | 黑人精品xxx一区一二区 | 亚洲免费在线视频 | 视频一二三区 | 免费毛片网站在线观看 | 手机看片在线播放 |