android-studio - Android リフレクション取得メソッド ClassNotFoundException
PHP中文网
PHP中文网 2017-05-16 13:24:23
0
2
1180

を取得したいので、リフレクションを使用して取得します。Bundle中持有的mMap集合.
bundle类中,有getMap()方法可以获取,但是被标记为hide リーリー

これは私がテストしたコードです。前にメソッドを直接呼び出したところ、例外がスローされました。そのため、すべてのメソッドを出力しました。 リーリー

ソースコードで見たメソッドは以下の通りです: (メソッド名のみコピーします。)

リーリー

その中で、

ですが、なぜ入手できるのですか?

と聞きたいです。 isParcelled(),getPairValue()也是被标记为hide私の携帯電話は

23以降に取得できないメソッドが追加されたのだと思います。SDKのバージョンの違いを確認する方法はあるのでしょうか、それとも他にもあるのでしょうか?理由

PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(2)
巴扎黑

Api23 と Api25 のバンドル ソース コードを比較しましたが、getMap に関する明確な情報はありませんでした。
次に、Api16 と Api25 のバンドル ソース コードを比較し、以下の図の黄色のブロックに示すような手がかりを見つけました。
Api25 では Bundle が BaseBundle を拡張していますが、Api16 では拡張されておらず、両方の側で使用されるデータ構造も変更されていることがわかります。

Api25

の BaseBundle を見てみましょう。実際に getMap があります: リーリー 次に、Api23 の BaseBundle で getMap を検索してみましょう。結果は次のとおりです。


明らかに、Api23 では、Bundle にもその親クラス BaseBundle にも getMap メソッドがないため、リフレクションは実行できません。どちらか調整しました。

いいねを押す +0
为情所困

@hide は javadoc タグに属しており、バンドル ソース コードが jar パッケージにコンパイルされると、生成された jar パッケージは開発者用であるため、IDE に直接渡すことはできません。バンドル オブジェクトへの参照は、バンドル クラスの Hide メソッドを直接呼び出します。これは、SDK コンパイル済みバージョンと変わりません。
Android 全体に慣れたら、Android ソース コードをコンパイルして独自の android.jar パッケージを生成してみることができます。たとえば、ここには多くのカメラ開発があり、多くのカメラ メソッドが隠されています。毎回リフレクションを介して Hide メソッドを呼び出すのは望ましくないため、カメラ内に隠されているメソッドを IDE で直接呼び出すことができるように、android.jar パッケージの完全なセットを独自にコンパイルしました。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート