Java反射問(wèn)題:為什么android.os.Message的recycleUnchecked方法不能通過(guò)反射獲取到?
問(wèn)題描述
Android源碼相關(guān)編程測(cè)試的時(shí)候遇到問(wèn)題,想用Java的反射機(jī)制調(diào)用Message的方法recycleUnchecked()(該方法不能直接在包外調(diào)用),使用如下語(yǔ)句:
Message.obtain().getClass().getDeclaredMethod('recycleUnchecked');
運(yùn)行時(shí)異常為:NoSuchMethodException
查看Java的API文檔:getDeclaredMethod方法是能獲取到當(dāng)前類(父類繼承的不算)中的所有方法,包括public,private,default和protected的
而recycleUnchecked方法在android.os.Message中的定義如下:
void recycleUnchecked(){...}
所以正常情況我的代碼應(yīng)該能夠正常訪問(wèn)到相應(yīng)方法的。
接著為了深入了解異常出現(xiàn)的原因,我用下面的代碼列出了Message中的所有方法:
int i = 0;Method[] methods = Message.obtain().getClass().getDeclaredMethods();for(Method method : methods){ i++; Log.i('JiahongZhou', i + '---' + method.getName() + method.getParameterTypes().toString());}
輸出結(jié)果如下:
JiahongZhou: 1---clearForRecycle[Ljava.lang.Class;@426d15d0JiahongZhou: 2---copyFrom[Ljava.lang.Class;@426dd788JiahongZhou: 3---describeContents[Ljava.lang.Class;@426e76d8JiahongZhou: 4---getCallback[Ljava.lang.Class;@426edbf0JiahongZhou: 5---getData[Ljava.lang.Class;@426eb8f8JiahongZhou: 6---getTarget[Ljava.lang.Class;@426ee8d8JiahongZhou: 7---getWhen[Ljava.lang.Class;@426f8f18JiahongZhou: 8---isAsynchronous[Ljava.lang.Class;@4271df20JiahongZhou: 9---isInUse[Ljava.lang.Class;@4272c078JiahongZhou: 10---markInUse[Ljava.lang.Class;@42761010JiahongZhou: 11---peekData[Ljava.lang.Class;@427e04d8JiahongZhou: 12---recycle[Ljava.lang.Class;@427e13e8JiahongZhou: 13---sendToTarget[Ljava.lang.Class;@4280ee48JiahongZhou: 14---setAsynchronous[Ljava.lang.Class;@42830f68JiahongZhou: 15---setData[Ljava.lang.Class;@4285ab70JiahongZhou: 16---setTarget[Ljava.lang.Class;@428904d0JiahongZhou: 17---toString[Ljava.lang.Class;@42891d78JiahongZhou: 18---toString[Ljava.lang.Class;@428a5248JiahongZhou: 19---writeToParcel[Ljava.lang.Class;@428ab450JiahongZhou: 20---access$000[Ljava.lang.Class;@428b8e88JiahongZhou: 21---obtain[Ljava.lang.Class;@428c6458JiahongZhou: 22---obtain[Ljava.lang.Class;@428da478JiahongZhou: 23---obtain[Ljava.lang.Class;@428e6288JiahongZhou: 24---obtain[Ljava.lang.Class;@428ff468JiahongZhou: 25---obtain[Ljava.lang.Class;@42915900JiahongZhou: 26---obtain[Ljava.lang.Class;@42915a08JiahongZhou: 27---obtain[Ljava.lang.Class;@42964730JiahongZhou: 28---obtain[Ljava.lang.Class;@425ef398JiahongZhou: 29---readFromParcel[Ljava.lang.Class;@425f50d0
可以看到在上面的輸出中看不見(jiàn)recycleUnchecked方法,然而和它定義相似(參數(shù)類型,訪問(wèn)權(quán)限限定符以及返回值均相同)的方法markInUse卻能輸出。
MarkInUse定義如下:
void markInUse(){...}
請(qǐng)問(wèn):Java的反射機(jī)制是否對(duì)某些特殊的方法做了不能被反射獲取的限制?為什么這里我獲取不到recycleUnchecked方法呢?是因?yàn)樗旧碓陬惣虞d的時(shí)候就不在Message的class對(duì)象里面嗎?如果沒(méi)有,那么它又是怎樣被訪問(wèn)的呢?
問(wèn)題解答
回答1:android.os.Message 類中只有 recycle() 方法,沒(méi)有你說(shuō)的 recycleUnchecked() 方法,可以通過(guò) SDK-Manager 下載 Android 的源碼。
相關(guān)文章:
1. html5 - 有可以一次性把所有 css外部樣式轉(zhuǎn)為html標(biāo)簽內(nèi)style=" "的方法嗎?2. sql語(yǔ)句 - mysql中關(guān)聯(lián)表查詢問(wèn)題3. javascript - [js]為什么畫布里不出現(xiàn)圖片呢?在線等4. javascript - 如何將一個(gè)div始終固定在某個(gè)位置;無(wú)論屏幕和分辨率怎么變化;div位置始終不變5. javascript - vscode alt+shift+f 格式化js代碼,通不過(guò)eslint的代碼風(fēng)格檢查怎么辦。。。6. html - vue項(xiàng)目中用到了elementUI問(wèn)題7. javascript - 有什么比較好的網(wǎng)頁(yè)版shell前端組件?8. javascript - iframe 為什么加載網(wǎng)頁(yè)的時(shí)候滾動(dòng)條這樣顯示?9. javascript - 這不是對(duì)象字面量函數(shù)嗎?為什么要new初始化?10. javascript - 原生canvas中如何獲取到觸摸事件的canvas內(nèi)坐標(biāo)?
