検索

ホームページ  >  に質問  >  本文

android-studio - Android リフレクション取得メソッド ClassNotFoundException

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

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

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

リーリー

その中で、

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

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

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

PHP中文网PHP中文网2753日前1175

全員に返信(2)返信します

  • 巴扎黑

    巴扎黑2017-05-16 13:26:23

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

    Api25

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


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

    返事
    0
  • 为情所困

    为情所困2017-05-16 13:26:23

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

    返事
    0
  • キャンセル返事