註解框架的原理理解

2021-07-02 17:54:02 字數 3205 閱讀 3852

關注註解 我想都不陌生了,android上採用註解來快速開發 我在實際工作中還沒試過,這裡簡介記錄一下我對android註解框架的理解。

註解在android開發中大致可以分為用在 方法 、成員、和 事件上,其他暫時不考慮。

引用註解,反射得到註解的值,

傳遞進入當前context反射得到method。field 等,然後執行invoke 方法即可

這樣可以通過註解反射成員變數(可以初始化控制項),成員方法(載入布局檔案)等。比較簡單。

btn = findviewbyid:可能需要多個btn,因此寫註解是多個的。@inject(value=id)

class<? extends activity> clazz = activity.getclass();

field fields = clazz.getdeclaredfields();

// 遍歷所有成員變數

for (field field : fields)

setoncontentview(id) :由於乙個類只有個layout布局設定,所以只需要乙個annotation就行了.(@contentview(value=id))

class<? extends activity> clazz = activity.getclass();

contentview contentview = clazz.getannotation(contentview.class);

以上是註解反射欄位和 反射方法。

下面這樣的**

btn.setonclicklistener(new view.onclicklistener())

將改為:

@onclick(value=r.id.btn1,value=r.id.btn2...)

public void myclick(view v)

1、反射得到btn

利用註解拿到id後 findviewbyid(id),得到button

2、利用proxy invocationhandler 建立介面(view.onclicklistener)的物件,可以自定義乙個類實現invocationhandler 。

例如下面**:

main:test:

invocationhandler i = new invocationhandler()

};//利用proxy建立出介面inte***cetest的物件,

object o = proxy.newproxyinstance(person.class.getclassloader(), new class, i);

//轉化為inte***cetest物件

inte***cetest inte***cetest = (inte***cetest) o;

//當呼叫物件的方法時,也就是介面中的方法時就會呼叫invocationhandler的invoke方法。上面的i就是**物件。

string result1 = inte***cetest.printinfo1();

inte***cetest.printinfo2();

string result = inte***cetest.printinfo3("1");

system.out.println(result);

public inte***ce inte***cetest

3、反射執行setonclicklistener

總體思想是把下面這句**,封裝起來,只把控制項id和自己定義的事件處理方法 提供給程式設計師來寫。

btn.setonclicklistener(new view.onclicklistener())

@onclick(value=r.id.btn1,value=r.id.btn2...)

public void myclick(view v)

那麼可以推測到有個註解 @inte***ce onclick。這個@inte***ce onclick註解裡面得完成btn.setonclicklistener(new view.onclicklistener()) 操作。而@inte***ce onclick是個註解。

所以只有在這個註解上再次使用乙個註解。於是乎有:

@target(elementtype.method)  

@retention(retentionpolicy.runtime)

@eventbase(listenertype = view.onclicklistener.class, listenersetter = "setonclicklistener", methodname = "onclick")

public @inte***ce onclick

那麼在 @inte***ce eventbase中來提供 設定listener的元素:監聽類的型別(onclicklistener.class),型別名稱(setonclicklistener),監聽類的方法也就是事件的處理方法

(onclick),有了這三個元素就可以 在驗證@inte***ce eventbase註解時 完成btn.setonclicklistener(obj)操作.

下面是實現的**:

/**

* 注入所有的onclick事件

* * @param activity

*/private static void injectevents(activity activity)

, handler);

//到此即可設定事件了:

for (int viewid : viewids)

} catch (exception e)}}

} }

方便快速開發的 註解框架基本原理 我理解就是這個了,下面是如何使用的問題,比較簡單。

@contentview(value = r.layout.activity_main)  //在類上加上註解 ,用來設定布局檔案

public class mainactivity extends activity implements onclicklistener }

public static void inject(activity activity)

CSS 原理理解

網頁製作最初,html規定了 normal document stream 標準文件流 來規範元素在網頁中的顯示法則 標準文件流中元素分兩種 塊內元素,行內元素。行內元素的特點 span標籤 豎直margin中的塌陷現象,上下緊密排列的元素的外邊距並不是兩個元素外邊距之和,而是選取那個最大的外邊距作...

Spring IOC原理理解

ioc,inversion of control,控制倒轉。這是spring的核心,貫穿始終。所謂ioc,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係。di,dependency injection,依賴注入。在系統執行中,動態的向某個物件提供它所需要的其他物件...

ROI Align 原理理解

對背景問題的理解 之前一直在想乙個問題 乙個label在原圖上標記出乙個包含目標的區域。這個框在特徵提取後,大小被縮小到了什麼程度?如果這個label框本身就不大,那麼經過幾層池化之後,是不是在最後的feature map上都沒有乙個位置,能夠對應到這個區域?目標在特徵提取過程中,由於這種深度結構導...