反射和注解簡單案例

反射

定義:通過類對象獲取這個(gè)類的屬性,方法,父類,和接口信息

用處:運(yùn)行時(shí)判斷任意一個(gè)對象所屬的類,構(gòu)造一個(gè)對象,動(dòng)態(tài)調(diào)用方法

相關(guān)方法:

getName():獲得類的完整名字。

newInstance():通過類的不帶參數(shù)的構(gòu)造方法創(chuàng)建這個(gè)類的一個(gè)對象。 getFields():獲得類的public類型的屬性。

getDeclaredFields():獲得類的所有屬性。

getMethods():獲得類的public類型的方法。

getDeclaredMethods():獲得類的所有方法。

getMethod(String name, Class[] parameterTypes):獲得類的特定方法。 getModifiers()和Modifier.toString():獲得屬修飾符,例如private,public,static等

getReturnType():獲得方法的返回類型

getParameterTypes():獲得方法的參數(shù)類型

getConstructors():獲得類的public類型的構(gòu)造方法。 getConstructor(Class[] parameterTypes):獲得類的特定構(gòu)造方法。 getSuperclass():獲取某類的父類

getInterfaces():獲取某類實(shí)現(xiàn)的接口

獲取類型:

EatBreckfast eatBreckfast =(EatBreckfast)Class.forName("eatBreckfast").newInstance();

//通過類型絕對路徑直接獲得這個(gè)類,

注解:

定義:與類型,接口,枚舉在同一層次,可以用來描述包類,字段,方法,變量等內(nèi)容

元注解:四個(gè)元注解

1.@Target ???//注解對應(yīng)的使用目標(biāo)

例如:@Target(ElementType.METHOD)//表示該注解應(yīng)用于方法

2.@Retention ?//留住類型 ??表示這個(gè)注解生效的生命周期

@Retention(RetentionPolicy.RUNTIME)//運(yùn)行時(shí)

3.@Documented:是一個(gè)標(biāo)記注解,用來描述其他類型的注解應(yīng)該被作為被標(biāo)注的程序成員的公共api,因此可以被javadoc之類的工具文檔化。

4.@Inherited:也是一個(gè)標(biāo)記注解,他表示某個(gè)被標(biāo)注的類型是可以被繼承的

定義格式:

public @interface注解名{}

例如

public@interfaceAddLog{

StringdialogContent()default"";// 可以理解為注解的字段?

}

注解的參數(shù)字段支持8種基本類型int float boolean byte double char long short String Class enum Annotation

結(jié)合動(dòng)態(tài)代理寫了個(gè)例子

首先是根據(jù)對象獲取類型

/***獲取傳入?yún)?shù)對象的類型*@paramarg*@return*@throwsException*/

privateClass[]getClassArray(Object[] arg)throwsException {

if(arg!=null&&arg.length>0){

Class[] classArray=newClass[arg.length];

for(inti=0;i

classArray[i]=arg[i].getClass();

}

returnclassArray;

}else{

throw newException("invaild param type !");

}

}

四個(gè)點(diǎn):

動(dòng)態(tài)參數(shù),線程池,反射和注解

**@paramtClass*@parammethodName*@paramarg*@throwsException*/public voidrunOnThread(finalClass tClass,String methodName,finalObject...arg)throwsException {

Class[] classeArray=getClassArray(arg);

finalMethod method =tClass.getMethod(methodName,classeArray);

pool.execute(newRunnable() {

@Override

public voidrun() {

/*** 在這里加入預(yù)處理*/method.setAccessible(true);

try{

AddLogaddLogAnnotation =method.getAnnotation(AddLog.class);

if(!TextUtils.isEmpty(addLogAnnotation.dialogContent())){

Log.e(TAG,"this is addlog,this will show befor invoke "+addLogAnnotation.dialogContent());

}

method.invoke(tClass.newInstance(),arg);//調(diào)用代理的方法

Log.e(TAG,"this is a test don't use annotion dynamicProxy ");

}catch(Exception e) {

e.printStackTrace();

}

}

});

}

動(dòng)態(tài)參數(shù):

方法定義使用了動(dòng)態(tài)參數(shù)(java1.5引入) 定義格式(Class...arg) 動(dòng)態(tài)參數(shù)必須是最后一個(gè)參數(shù)或者唯一參數(shù),然后動(dòng)態(tài)參數(shù)的類型必須是相同的,實(shí)際上這個(gè)動(dòng)態(tài)參數(shù)可以看做是一個(gè)list但是 省去了穿入?yún)?shù)的時(shí)候的拼裝過程,在這里我們通過上前面的getClassArray來獲取數(shù)據(jù)的類型因此使用了Object來做為數(shù)據(jù)類型這樣我們可以傳入任何數(shù)據(jù)類型,算是投機(jī)取巧吧(不知道這樣會(huì)不會(huì)有其他不良后果), 這樣使用動(dòng)態(tài)參數(shù)有一個(gè)顯而易見的風(fēng)險(xiǎn),如果調(diào)用這個(gè)方法的重載或者使用反射來獲取方法名如下文

finalMethod method =tClass.getMethod(methodName,classeArray);

這樣如果有多個(gè)匹配參數(shù)的方法會(huì)導(dǎo)致編譯失敗,所以應(yīng)該避免使用類型不明確的方式去調(diào)用方法

finalMethod method =tClass.getMethod(methodName,classeArray);

這句也是用類型反射獲取方法

AddLogaddLogAnnotation =method.getAnnotation(AddLog.class);

這樣表示獲取方法的注解然后我們可以根據(jù)獲取到的注解作出相應(yīng)的操作,例如原文中我們將注解:

@AddLog

上的dialogContent內(nèi)容打成日志

然后,over!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內(nèi)容