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

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

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

[[398862]]

想了解更多內(nèi)容,請訪問:

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

https://harmonyos.51cto.com

本文是關(guān)于ButterKnife的移植的第一篇:

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

這是讀懂BufferKnife源碼的基礎(chǔ)。

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

基礎(chǔ)知識

apt技術(shù)的實際應用:

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

真的好多,很重要。apt就是生產(chǎn)力工具!

什么是apt?

通俗講:apt就是javac對外開放的一個插件,使javac在編譯期間獲取注解(Annotation),并做出相應的處理(多數(shù)都是生成一些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,實現(xiàn)其中的getSupportedAnnotationTypes()該方法注冊要解析的注解。

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

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

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

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

很繞,只有多用才能真正理解。比如: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)

關(guān)于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")//給方法加上參數(shù) 
  5.         .addStatement("$T substitute = ($T)target", className, className);//在方法體內(nèi)定義一條語名 

 上面的代碼生成下面的代碼(我用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,調(diào)用 其中的inject方法,完成view的注入。

總結(jié)

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

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

想了解更多內(nèi)容,請訪問:

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

https://harmonyos.51cto.com

 

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

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

鴻蒙安卓操作系統(tǒng)

2013-12-12 16:23:53

安卓進化AndroidGoogle

2020-09-10 09:30:03

鴻蒙安卓操作系統(tǒng)

2016-12-14 14:43:11

ButterknifeAndroid

2021-10-26 06:59:40

Windows 11操作系統(tǒng)微軟

2011-11-23 09:57:28

安卓驅(qū)動

2016-12-28 09:30:37

Andriod安卓平臺依賴注入

2021-05-20 05:27:50

安卓系統(tǒng)應用安卓12

2013-09-11 09:43:06

蘋果安卓

2019-07-12 16:00:25

華為禁令開發(fā)

2021-06-04 05:13:22

鴻蒙

2021-05-18 15:44:13

IOS安卓鴻蒙

2013-11-04 14:49:34

安卓

2018-02-09 08:59:47

安卓FuchsiaiOS

2018-05-09 10:39:21

Google安卓 系操作系統(tǒng)

2013-04-24 11:33:50

安卓

2021-02-25 10:40:00

數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品一区二区 | 天天操网| 久久一区二区视频 | 日韩欧美国产一区二区三区 | 韩日免费视频 | 99在线免费观看 | 天堂成人国产精品一区 | 久久在线 | 一区二区三区精品视频 | 亚洲成人精品一区 | 中文精品一区二区 | 日韩av在线免费 | 欧美精品一二区 | 日韩欧美在线不卡 | 日韩精品久久一区二区三区 | 日韩视频一级 | 黄网站在线观看 | 国产精品一区二区在线观看 | 中文字幕一区二区三区四区五区 | 黄色精品| 在线区| 人人干在线 | 日韩中文字幕一区 | 国产精品国产 | 九九热在线视频观看这里只有精品 | 久久精品国产一区二区电影 | 一区二区三区四区在线视频 | 81精品国产乱码久久久久久 | 欧美视频免费在线观看 | 国产91成人 | 青青草av | 91玖玖| 国产精品美女一区二区 | 久久国产精品久久久久 | 欧美成人精品一区二区三区 | 国产精品亚洲精品 | 二区亚洲 | 99久久婷婷国产综合精品电影 | 婷婷成人在线 | 国产精品一区二区在线观看 | 久久天天躁狠狠躁夜夜躁2014 |