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

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

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

瀏覽:195日期: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久久,三上悠亚国产精品一区二区三区
亚洲欧洲日韩| 日韩高清欧美激情| 国产精品porn| 久久精品国产网站| 日韩精品一区二区三区免费观影 | 老牛国产精品一区的观看方式| 亚洲一级淫片| 色综合狠狠操| 日韩av一区二区三区| 黑森林国产精品av| 日韩视频1区| 国产欧美激情| 国产一在线精品一区在线观看| 青草国产精品| 久久精品官网| 国产探花一区在线观看| 激情久久五月| 精品少妇av| 亚洲一区观看| 在线视频观看日韩| 国产精品亚洲人成在99www| 天堂网在线观看国产精品| 久久av网址| av成人国产| 另类专区亚洲| 久久中文在线| 伊人久久婷婷| 亚洲精品成人图区| 国产精品久久久久久久久妇女| 蜜臀a∨国产成人精品| 99久久亚洲精品蜜臀| 你懂的国产精品永久在线| 亚洲精选成人| 国产精品毛片| 秋霞影院一区二区三区| 久久精品亚洲一区二区| 人人精品久久| 蜜臀av亚洲一区中文字幕| 国产日韩视频在线| 精品视频黄色| 美女在线视频一区| 好看的亚洲午夜视频在线| 亚洲啊v在线| 久久亚州av| 久久99精品久久久久久园产越南 | 国产精品magnet| 群体交乱之放荡娇妻一区二区| 97se综合| 国产精品伊人| 免费黄色成人| 不卡在线一区| 久久免费精品| 国产精品毛片视频| 日韩三级久久| 在线免费观看亚洲| 黄色精品视频| 久久精品国产久精国产| 亚洲v天堂v手机在线| 免费视频最近日韩| 亚洲精品观看| 97久久精品| 青青草国产精品亚洲专区无| 一区免费在线| 免费高清在线一区| 天堂精品久久久久| 亚洲资源在线| aa国产精品| 麻豆亚洲精品| 亚洲开心激情| 亚洲精品在线二区| 日韩一区免费| 亚洲丝袜美腿一区| 日本91福利区| 免费在线日韩av| 亚洲欧美网站在线观看| 亚州欧美在线| 国产精品红桃| 日本欧美不卡| 欧美资源在线| 91久久国产| 欧美在线资源| 久久久久美女| 亚洲综合丁香| 亚洲电影有码| 国精品一区二区三区| 日本欧美在线看| 91综合久久爱com| 美女精品视频在线| 欧美天堂视频| 亚洲免费中文| 日韩超碰人人爽人人做人人添| 国产精品调教| 免费在线亚洲欧美| 久久天堂精品| 一区二区亚洲精品| 亚洲精品综合| 久久精品99国产精品日本| 国产视频一区二区在线播放| 日韩欧美国产精品综合嫩v| 九九久久婷婷| 日韩高清一级| av最新在线| 日本h片久久| 亚洲高清成人| 日韩精品一区二区三区免费观看| 91精品国产自产在线丝袜啪| 亚洲精品第一| 91精品美女| 欧美精品1区| 久久国内精品自在自线400部| 日韩精彩视频在线观看| 免费成人在线视频观看| 少妇精品在线| 国产日韩欧美一区二区三区| 久久av电影| 激情久久99| 91精品综合| 免播放器亚洲一区| 国产毛片精品久久| 国产aa精品| 欧美高清不卡| 男人操女人的视频在线观看欧美| 日韩国产精品久久久久久亚洲| 国产精品久久| 九九色在线视频| 香蕉精品999视频一区二区| av资源亚洲| 欧美一级精品| 亚洲主播在线| 国产探花一区| 欧美13videosex性极品| av不卡在线看| 欧美日韩xxxx| 成人一二三区| 久久亚洲二区| 国产福利资源一区| 欧美肉体xxxx裸体137大胆| 日韩一区精品字幕| 国产精品一区二区精品| 99国产精品免费视频观看| 亚洲欧美日韩国产| 一区二区亚洲视频| 免费一区二区三区在线视频| 91精品综合| 亚洲精品系列| 日韩精品1区| 综合激情五月婷婷| 精品五月天堂| 午夜日本精品| 国产福利一区二区精品秒拍| 久久精品青草| 亚洲欧美日本国产| 日韩免费av| 日韩成人精品一区二区三区| 日韩精品不卡一区二区| 亚洲精选成人| 国产精品www.| 欧美日韩国产免费观看| 国产精品美女久久久久久不卡| 91精品亚洲| 国产欧美一区二区色老头| 午夜久久福利| 国产一区国产二区国产三区| 国产女优一区| 午夜av不卡| 国产精品密蕾丝视频下载| 99国产精品99久久久久久粉嫩| 国产精品porn| 亚洲精品乱码日韩| 日韩精品免费一区二区三区| 国产欧美三级| xxxxx性欧美特大| 国产日韩一区二区三区在线播放| 午夜国产精品视频| 成人一区而且| 欧美亚洲国产日韩| 亚洲欧美成人综合| 日韩免费看片| 嫩草伊人久久精品少妇av杨幂| 美女久久一区| 美女亚洲一区| 中文字幕成在线观看| 国产精品色婷婷在线观看| 视频一区二区中文字幕| 99视频精品全国免费| 久久久久久夜| 亚洲精品一级二级三级| 91精品国产91久久久久久黑人| 国语对白精品一区二区| 国产亚洲一区| 亚州精品视频| 噜噜噜躁狠狠躁狠狠精品视频| 久久精品国产亚洲夜色av网站| 麻豆精品99| 免费视频一区二区三区在线观看 | 亚洲制服少妇| 久久91导航| 麻豆一区二区三| 少妇精品在线| 亚洲视频电影在线|