日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

android-studio - Android 反射獲取方法 ClassNotFoundException

瀏覽:198日期:2024-08-16 14:49:08

問題描述

我是想獲取Bundle中持有的mMap集合.在bundle類中,有getMap()方法可以獲取,但是被標記為hide,所以我用反射去取.

ArrayMap<String, Object> metaMap= null;try { Class ownerClass = Class.forName(Bundle.class.getName()); Class superclass = ownerClass.getSuperclass(); Method[] declaredMethods = superclass.getDeclaredMethods();// getMapMethod.setAccessible(true);// metaMap= (ArrayMap<String, Object>) getMapMethod.invoke(metaData); Log.e('test','superclass: '+superclass.getName()); declaredMethods.toString();} catch (ClassNotFoundException e) { e.printStackTrace();}

這是我測試的代碼,之前是直接調方法,然后拋異常了.于是我就打印了所有的方法:

0 = {Method@4216} 'public void android.os.BaseBundle.clear()'1 = {Method@4217} 'public boolean android.os.BaseBundle.containsKey(java.lang.String)'2 = {Method@4218} 'public java.lang.Object android.os.BaseBundle.get(java.lang.String)'3 = {Method@4219} 'public boolean android.os.BaseBundle.getBoolean(java.lang.String)'4 = {Method@4220} 'public boolean android.os.BaseBundle.getBoolean(java.lang.String,boolean)'5 = {Method@4221} 'public [Z android.os.BaseBundle.getBooleanArray(java.lang.String)'6 = {Method@4222} 'byte android.os.BaseBundle.getByte(java.lang.String)'7 = {Method@4223} 'java.lang.Byte android.os.BaseBundle.getByte(java.lang.String,byte)'8 = {Method@4224} '[B android.os.BaseBundle.getByteArray(java.lang.String)'9 = {Method@4225} 'char android.os.BaseBundle.getChar(java.lang.String)'10 = {Method@4226} 'char android.os.BaseBundle.getChar(java.lang.String,char)'11 = {Method@4227} '[C android.os.BaseBundle.getCharArray(java.lang.String)'12 = {Method@4228} 'java.lang.CharSequence android.os.BaseBundle.getCharSequence(java.lang.String)'13 = {Method@4229} 'java.lang.CharSequence android.os.BaseBundle.getCharSequence(java.lang.String,java.lang.CharSequence)'14 = {Method@4230} '[Ljava.lang.CharSequence; android.os.BaseBundle.getCharSequenceArray(java.lang.String)'15 = {Method@4231} 'java.util.ArrayList android.os.BaseBundle.getCharSequenceArrayList(java.lang.String)'16 = {Method@4232} 'java.lang.ClassLoader android.os.BaseBundle.getClassLoader()'17 = {Method@4233} 'public double android.os.BaseBundle.getDouble(java.lang.String)'18 = {Method@4234} 'public double android.os.BaseBundle.getDouble(java.lang.String,double)'19 = {Method@4235} 'public [D android.os.BaseBundle.getDoubleArray(java.lang.String)'20 = {Method@4236} 'float android.os.BaseBundle.getFloat(java.lang.String)'21 = {Method@4237} 'float android.os.BaseBundle.getFloat(java.lang.String,float)'22 = {Method@4238} '[F android.os.BaseBundle.getFloatArray(java.lang.String)'23 = {Method@4239} 'public int android.os.BaseBundle.getInt(java.lang.String)'24 = {Method@4240} 'public int android.os.BaseBundle.getInt(java.lang.String,int)'25 = {Method@4241} 'public [I android.os.BaseBundle.getIntArray(java.lang.String)'26 = {Method@4242} 'java.util.ArrayList android.os.BaseBundle.getIntegerArrayList(java.lang.String)'27 = {Method@4243} 'public long android.os.BaseBundle.getLong(java.lang.String)'28 = {Method@4244} 'public long android.os.BaseBundle.getLong(java.lang.String,long)'29 = {Method@4245} 'public [J android.os.BaseBundle.getLongArray(java.lang.String)'30 = {Method@4246} 'public java.lang.String android.os.BaseBundle.getPairValue()'31 = {Method@4247} 'java.io.Serializable android.os.BaseBundle.getSerializable(java.lang.String)'32 = {Method@4248} 'short android.os.BaseBundle.getShort(java.lang.String)'33 = {Method@4249} 'short android.os.BaseBundle.getShort(java.lang.String,short)'34 = {Method@4250} '[S android.os.BaseBundle.getShortArray(java.lang.String)'35 = {Method@4251} 'public java.lang.String android.os.BaseBundle.getString(java.lang.String)'36 = {Method@4252} 'public java.lang.String android.os.BaseBundle.getString(java.lang.String,java.lang.String)'37 = {Method@4253} 'public [Ljava.lang.String; android.os.BaseBundle.getStringArray(java.lang.String)'38 = {Method@4254} 'java.util.ArrayList android.os.BaseBundle.getStringArrayList(java.lang.String)'39 = {Method@4255} 'public boolean android.os.BaseBundle.isEmpty()'40 = {Method@4256} 'public boolean android.os.BaseBundle.isParcelled()'41 = {Method@4257} 'public java.util.Set android.os.BaseBundle.keySet()'42 = {Method@4258} 'public void android.os.BaseBundle.putAll(android.os.PersistableBundle)'43 = {Method@4259} 'void android.os.BaseBundle.putAll(android.util.ArrayMap)'44 = {Method@4260} 'public void android.os.BaseBundle.putBoolean(java.lang.String,boolean)'45 = {Method@4261} 'public void android.os.BaseBundle.putBooleanArray(java.lang.String,boolean[])'46 = {Method@4262} 'void android.os.BaseBundle.putByte(java.lang.String,byte)'47 = {Method@4263} 'void android.os.BaseBundle.putByteArray(java.lang.String,byte[])'48 = {Method@4264} 'void android.os.BaseBundle.putChar(java.lang.String,char)'49 = {Method@4265} 'void android.os.BaseBundle.putCharArray(java.lang.String,char[])'50 = {Method@4266} 'void android.os.BaseBundle.putCharSequence(java.lang.String,java.lang.CharSequence)'51 = {Method@4267} 'void android.os.BaseBundle.putCharSequenceArray(java.lang.String,java.lang.CharSequence[])'52 = {Method@4268} 'void android.os.BaseBundle.putCharSequenceArrayList(java.lang.String,java.util.ArrayList)'53 = {Method@4269} 'public void android.os.BaseBundle.putDouble(java.lang.String,double)'54 = {Method@4270} 'public void android.os.BaseBundle.putDoubleArray(java.lang.String,double[])'55 = {Method@4271} 'void android.os.BaseBundle.putFloat(java.lang.String,float)'56 = {Method@4272} 'void android.os.BaseBundle.putFloatArray(java.lang.String,float[])'57 = {Method@4273} 'public void android.os.BaseBundle.putInt(java.lang.String,int)'58 = {Method@4274} 'public void android.os.BaseBundle.putIntArray(java.lang.String,int[])'59 = {Method@4275} 'void android.os.BaseBundle.putIntegerArrayList(java.lang.String,java.util.ArrayList)'60 = {Method@4276} 'public void android.os.BaseBundle.putLong(java.lang.String,long)'61 = {Method@4277} 'public void android.os.BaseBundle.putLongArray(java.lang.String,long[])'62 = {Method@4278} 'void android.os.BaseBundle.putSerializable(java.lang.String,java.io.Serializable)'63 = {Method@4279} 'void android.os.BaseBundle.putShort(java.lang.String,short)'64 = {Method@4280} 'void android.os.BaseBundle.putShortArray(java.lang.String,short[])'65 = {Method@4281} 'public void android.os.BaseBundle.putString(java.lang.String,java.lang.String)'66 = {Method@4282} 'public void android.os.BaseBundle.putStringArray(java.lang.String,java.lang.String[])'67 = {Method@4283} 'void android.os.BaseBundle.putStringArrayList(java.lang.String,java.util.ArrayList)'68 = {Method@4284} 'void android.os.BaseBundle.readFromParcelInner(android.os.Parcel)'69 = {Method@4285} 'public void android.os.BaseBundle.remove(java.lang.String)'70 = {Method@4286} 'void android.os.BaseBundle.setClassLoader(java.lang.ClassLoader)'71 = {Method@4287} 'public int android.os.BaseBundle.size()'72 = {Method@4288} 'void android.os.BaseBundle.typeWarning(java.lang.String,java.lang.Object,java.lang.String,java.lang.ClassCastException)'73 = {Method@4289} 'void android.os.BaseBundle.typeWarning(java.lang.String,java.lang.Object,java.lang.String,java.lang.Object,java.lang.ClassCastException)'74 = {Method@4290} 'synchronized void android.os.BaseBundle.unparcel()'75 = {Method@4291} 'void android.os.BaseBundle.writeToParcelInner(android.os.Parcel,int)'76 = {Method@4292} 'private void android.os.BaseBundle.readFromParcelInner(android.os.Parcel,int)'

我在源碼中看到的方法如下:(只復制了方法名.)

BaseBundleBaseBundleBaseBundleBaseBundleBaseBundleBaseBundleBaseBundleclearcontainsKeygetgetBooleangetBooleangetBooleanArraygetBytegetBytegetByteArraygetChargetChargetCharArraygetCharSequencegetCharSequencegetCharSequenceArraygetCharSequenceArrayListgetClassLoadergetDoublegetDoublegetDoubleArraygetFloatgetFloatgetFloatArraygetIntgetIntgetIntArraygetIntegerArrayListgetLonggetLonggetLongArraygetMapgetPairValuegetSerializablegetShortgetShortgetShortArraygetStringgetStringgetStringArraygetStringArrayListisEmptyisEmptyParcelisParcelledkeySetputAllputAllputBooleanputBooleanArrayputByteputByteArrayputCharputCharArrayputCharSequenceputCharSequenceArrayputCharSequenceArrayListputDoubleputDoubleArrayputFloatputFloatArrayputIntputIntArrayputIntegerArrayListputLongputLongArrayputSerializableputShortputShortArrayputStringputStringArrayputStringArrayListreadFromParcelInnerreadFromParcelInnerremovesetClassLoadersetShouldDefusesizetypeWarningtypeWarningunparcelwriteToParcelInner

其中,isParcelled(),getPairValue()也是被標記為hide,但是卻能獲取到.想問問是為什么?

我猜測是sdk版本原因,我的手機是sdk = 23,我編譯的版本為25,我猜測那幾個沒獲取到的方法是23之后添加的,不知有沒有什么可以查看sdk版本差異測方法,或者是其他的原因.

問題解答

回答1:

我對比了下 Api23和Api25兩個的Bundle源碼,沒有關于getMap的明顯信息,然后又對比了下Api16和Api25兩個的Bundle源碼,發現端倪,如下圖黃色塊標注:android-studio - Android 反射獲取方法 ClassNotFoundException我們可以看到Api25上,Bundle extends BaseBundle,而Api16卻沒有,而且兩邊采用的數據結構也發生了變化。

我們看下Api25上的BaseBundle,確實有getMap :

/** @hide */ArrayMap<String, Object> getMap() { unparcel(); return mMap;}

然后我們在看下在Api23的BaseBundle里面搜getMap,結果如下:android-studio - Android 反射獲取方法 ClassNotFoundException很明顯,在Api23上,無論是Bundle,還是它的父類BaseBundle,都是不存在getMap方法的,所以反射也調不到。

回答2:

@hide 屬于一個javadoc的標簽, Bundle源碼在編譯成jar包的時候會把@hide標記過的方法 排除掉, 生成的jar包是給開發者使用的, 所以在IDE中我們是沒辦法直接通過bundle對象的引用去直接調用到bundle類hide起來的方法的, 這個跟sdk編譯的版本是沒差別的。等到后期你熟悉了android的整體后, 可以自己嘗試著編譯一下android源碼生成自己的android.jar包, 打個比方說, 這邊做camera開發比較多, 而camera不少方法都被hide了 我們又不想每次都通過反射去調用hide方法, 于是乎, 我們自己編譯了一套完整的android.jar包, 在camera中被hide的方法就可以在 ide中直接調用到了。

相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费成人在线视频观看| 日韩欧美精品| 久久精品青草| 桃色一区二区| 亚洲成人va| 播放一区二区| 欧洲在线一区| 99在线精品免费视频九九视 | 国产欧美日韩一区二区三区四区 | 日本午夜精品一区二区三区电影| 视频在线观看一区| 日本不卡中文字幕| 久久99久久久精品欧美| 在线中文字幕播放| 天堂成人免费av电影一区 | 综合日韩av| 午夜欧美在线| 亚洲人成毛片在线播放女女| 日韩一区网站| 综合日韩av| 性色一区二区| 久久精品99久久久| 伊人久久国产| 蜜臀va亚洲va欧美va天堂| 91久久精品无嫩草影院| 精品国产一区二区三区av片| 香蕉久久99| 日本午夜精品久久久久| 精品视频一区二区三区四区五区| 久久国产日韩| 美女精品久久| 1000部精品久久久久久久久| 免费看日韩精品| 国产一区二区三区91| 伊人久久成人| 久久亚洲精品中文字幕| japanese国产精品| 日韩欧美2区| 色爱av综合网| 久久只有精品| 日韩中文字幕无砖| 久久精品影视| 国产成人精品一区二区三区免费| 亚洲免费激情| 人在线成免费视频| 美女视频网站久久| 亚洲精品免费观看| 亚洲精品一区二区妖精| 精品一区二区三区中文字幕 | 国产精品成人自拍| 蜜桃视频一区二区| 欧美日韩在线网站| 亚洲综合电影| 精品欧美视频| 欧美伊人久久| 欧美色综合网| 视频一区二区三区中文字幕| 亚洲一级黄色| 九一国产精品| 尤物在线精品| 亚洲开心激情| 天使萌一区二区三区免费观看| 久久激情网站| 伊人久久亚洲热| 在线一区免费观看| 蜜桃91丨九色丨蝌蚪91桃色| 久久av一区二区三区| 精品91久久久久| 亚洲免费福利一区| 欧美视频一区| 精品精品国产三级a∨在线| 国产一区二区三区四区五区| 黄色在线观看www| 亚洲婷婷免费| 亚洲日产国产精品| 麻豆国产精品一区二区三区| 精品中国亚洲| 成人日韩在线| 99视频在线精品国自产拍免费观看| 国产精品毛片在线| 国产精品宾馆| 欧美精品一二| 91精品国产一区二区在线观看| 麻豆国产一区| 亚洲黄色影院| 精品视频一二| 国产一级一区二区| 精品视频一区二区三区四区五区| 久久国产直播| 国产午夜精品一区在线观看| 欧美aa一级| 亚洲精品一区二区在线播放∴| 久久精品国产亚洲一区二区三区| 欧美 日韩 国产精品免费观看| 国产欧美日韩在线观看视频| 在线精品视频在线观看高清| 日本欧美一区二区| 亚洲v在线看| 国产精品一区二区av日韩在线| 欧美日韩视频免费观看| 欧美久久亚洲| 香蕉久久久久久久av网站| 国产中文字幕一区二区三区| 手机精品视频在线观看| 亚洲一级少妇| 97精品国产福利一区二区三区| 石原莉奈在线亚洲二区| 国产盗摄——sm在线视频| 日韩三级视频| 美女国产精品| 亚洲精品a级片| 亚洲风情在线资源| 国产精品调教| 伊人久久亚洲| 亚洲视频二区| 欧美综合二区| 国产农村妇女精品一二区 | 蜜臀久久久久久久| 99精品电影| 91精品久久久久久久久久不卡| 国产精品免费不| 日韩欧美美女在线观看| 亚洲日韩中文字幕一区| 久久成人亚洲| 三级欧美韩日大片在线看| 91久久久精品国产| 日韩视频二区| 丝袜脚交一区二区| 亚洲欧美不卡| 日韩极品在线观看| 欧美日韩精品一区二区三区在线观看| 日韩三级一区| 国产精品一线天粉嫩av| 国产精品成人自拍| 麻豆成人综合网| 美女久久久精品| аⅴ资源天堂资源库在线| 美女福利一区二区三区| 成人日韩精品| 亚洲黄页一区| 欧美亚洲tv| 精品中文字幕一区二区三区| 成人影视亚洲图片在线| 亚洲特级毛片| 亚洲一区二区日韩| 欧美精品国产| 日韩伦理福利| 蜜臀久久99精品久久久久久9| 日韩av中文字幕一区| 精品视频网站| 久久久久.com| 免费在线视频一区| 国产免费播放一区二区| 精品久久福利| 国产日韩专区| 久久影院资源站| 欧洲毛片在线视频免费观看| 天堂精品久久久久| 免费看av不卡| 日韩动漫一区| 米奇777超碰欧美日韩亚洲| 日韩免费精品| 日韩中文在线播放| 国产亚洲欧美日韩精品一区二区三区 | 精品久久在线| 国产亚洲高清视频| 久久久久黄色| 在线看片日韩| 久久久夜夜夜| 欧美a一区二区| 蜜桃视频一区二区| 日韩天堂在线| 国产毛片一区二区三区| 日韩视频二区| 久久精品123| 久久精品xxxxx| 最新亚洲国产| 久久亚洲视频| 久久视频国产| 成人在线观看免费视频| 日本va欧美va精品| 一级成人国产| 中文一区二区| 欧美亚洲国产激情| 免费看av不卡| 国产成人精品三级高清久久91| 国产欧美自拍| 欧美亚洲福利| 日韩福利视频网| 久久精品99国产精品| 久久亚洲电影| 亚洲欧美日韩在线观看a三区| 久久亚洲国产| 欧美日韩黑人| 国产精品婷婷| 亚洲美女91| 国产精品一站二站| 免费在线观看一区| 国产精品成久久久久| 美女一区网站|