誰かがこのコードを説明できますか私はJavaに少し慣れていません
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
これは反射と呼ばれます。コンパイル時ではなく、実行時にクラス、オブジェクト、およびメソッドにアクセスします。また、Android固有ではありません。
「JavaのReflectionAPIを使用すると、コンパイル時にクラス、メソッドなどの名前を知らなくても、実行時にクラス、インターフェイス、フィールド、メソッドを検査できます。また、新しいオブジェクトをインスタンス化し、メソッドを呼び出し、フィールドを取得/設定することもできます。リフレクションを使用した値。」
Java Reflectionを使用すると、実行中のJavaプログラムは、それ自体を調べたり「イントロスペクト」したり、プログラムの内部プロパティを操作したりできます。たとえば、Javaクラスがそのすべてのメンバーの名前を取得して表示することができます。
を呼び出すとClass.forName("X")
、Xという名前のクラスが動的にロードされます(実行時)。forName( "X")を呼び出すと、Xという名前のクラスが初期化されます(つまり、JVMはクラスのロード後にすべての静的ブロックを実行します)。Class.forName("X")
「X」クラスに関連付けられたClassオブジェクトを返します。返されるClassオブジェクトは、「x」クラス自体のインスタンスではありません。
Class.forName("X")
クラスがまだロードされていない場合は、クラスをロードします。JVMは、以前にロードされたすべてのクラスを追跡します。このメソッドは、それを呼び出すクラスのクラスローダーを使用します。「X」は、目的のクラスの完全修飾名です。
getDeclaredMethod()
2番目のステップは、getDeclaredMethodなどのメソッドを呼び出して、クラスによって宣言された引数で指定されたメソッドを取得することです。
詳細については、こちらをご覧ください。
telephony.getClass().getName()
オブジェクトの完全修飾クラス名を含む文字列を抽出しますtelephony
。
Class.forName(...)
完全修飾名を使用してClassオブジェクトを取得します。
c.getDeclaredMethod("getITelephony")
Method
名前付き のをリフレクションによって取得します"getITelephony"
。
ところで、これらはすべて次のように書き直すことができます。telephony.getClass().getDeclaredMethod("getITelephony")
telephony
これにより、変数に関連付けられているクラスの名前が返されます。
telephony.getClass().getName()
これにより、以前に取得した名前のクラスへの参照が返されます。
telephony.getClass().getName()
代わりにこれを行うことができるので、これはちょっと無意味です:
Class c = telephony.getClass();
2行目は、クラスのメソッドをMethod
表すオブジェクトへの参照を返します。getITelephony
c
おそらくあなたはAndroidで着信を自動的に受信しようとしています...
ただし、重要な点は、ITelephonyはプライベートAPIであるため、Googleがこれをブロックしていることです。
これで質問に答えられると判断した場合は、「承認済み」としてマークしてください。これにより、あなたと私の評判スコアの両方が上がります。