2

Reflection 自体に問題があるのか​​、取得しようとしている方法に問題があるのか​​わかりません。

私がやりたいことは、クラスから setLine1Number 関数を呼び出すことです:

com.android.internal.telephony.gsm.GSMPhone

自分の電話番号を SIM に入れる必要がないので、電話番号を適切に挿入できるようにします。したがって、関数 getLine1Number を呼び出して、設定したのと同じ番号を返すようにしたいと考えています。

この関数はパブリック API にはないため、リフレクションがこの関数を使用できる唯一の方法のようです。

これを書きましたが、不正な引数の例外が発生し続けます。これが私のコードです:

String className = "com.android.internal.telephony.gsm.GSMPhone";
Class classToInvestigate = Class.forName(className);

Object arglist[] = new Object[3];
arglist[0] = new String("Phone Number");
arglist[1] = new String ("16035552412"); // Not a real phone number
arglist[2] = null;

Class[] paramTypes = new Class[3];
paramTypes[0] = String.class;
paramTypes[1] = String.class;
paramTypes[2] = Message.class;
Method setLine1Number = classToInvestigate.getMethod("setLine1Number", paramTypes);
setLine1Number.setAccessible(true);

Object TestReturn = setLine1Number.invoke(classToInvestigate, arglist); // Problem is here. Not sure how to properly do this. 

この時点で、お電話いただければ幸いです

TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String PhoneNumber2 =  telephonyManager.getLine1Number();

入力した数値を返すようにします。しかし、私が言ったように、不正な引数の例外であり、これを解決する方法が正確にはわかりません。どんな助けでも感謝します。私はまだリフレクションに慣れていないので、これは簡単な問題かもしれません。

エラーログは次のとおりです。

エラーログ


他に言い忘れたことは、次のコードを使用して、このメソッドがクラス ファイルに実際に存在することを確認したことです。

        Method[] checkMethod = classToInvestigate.getDeclaredMethods();

        Test = new String[checkMethod.length];
        int i = 0;
        for(Method m : checkMethod)  
        {  
            // Found a method m  
            Test[i] = m.getName();
            i++;
        }  

そして、メソッド setLine1Number が配列で返されました。だから私はそれがそこにあるとかなり確信しており、何とかそれを使用することができます.

4

7 に答える 7

1

GSMPhone (classToInvestigate) のインスタンスを作成する必要があります。これが始まりです:

Class commandsInterface = Class.forName("com.android.internal.telephony.CommandsInterface");
Class phoneNotifier = Class.forName("com.android.internal.telephony.PhoneNotifier");
Constructor constructor = classToInvestigate.getConstructor(Context.class, commandsInterface, phoneNotifier);

// This creation of newInstance will have to be modified depending on NullPointerExceptions.
// Will probably have to pass in context, as well as instantiate CommandsInterface and PhoneNotifier in a similar fashion and then inject them as well.
Object newInstance = constructor.newInstance(context, null, null);

setLine1Number.invoke(newInstance, arglist);
于 2012-02-21T07:40:15.577 に答える
1

操作したいクラスのインスタンス、つまりすでに作成されているそのタイプのオブジェクトが必要です。

あなたはそれをに渡しますsetLine1Number.invoke()

たとえば、Integerクラスを扱っていたとしたら、次のように言うでしょう。

Integer i = new Integer(5);
...
Object TestReturn = someIntegerMethod.invoke(i, arglist);
于 2012-02-20T23:36:25.377 に答える
0

アクセスできないフィールドを設定したり、アクセスできないメソッドを呼び出したりする場合は、必要に応じてそれらをアクセス可能に設定できます。以下を参照してください。

https://github.com/ko5tik/andject/blob/master/src/main/java/de/pribluda/android/andject/ViewInjector.java

(34-37行目)

于 2012-02-21T07:49:24.190 に答える
0

クラスオブジェクトではなく、メソッドを呼び出したいタイプのオブジェクトを渡す必要があります。

于 2012-02-20T22:56:42.240 に答える
0

呼び出しでは、クラスinvokeのインスタンスを渡す必要はありませんGSMPhoneclassToInvestigate

私は Android API に詳しくないので、そのインスタンスを取得する方法がわかりません。

編集: GSMPhoneを見ると、そのクラスのインスタンスを取得して代わりにそのメソッドを呼び出すことができるパブリック メソッドがSIMRecords呼び出されますか?

于 2012-02-20T23:11:31.253 に答える
-1

次のコードを試してください。

String className = "com.android.internal.telephony.gsm.GSMPhone";
Class classToInvestigate = Class.forName(className);
Object gsmObj = classToInvestigate.newInstance();

Object arglist[] = new Object[3];
arglist[0] = new String("Phone Number");
arglist[1] = new String ("16035552412"); // Not a real phone number
arglist[2] = null;

Class[] paramTypes = new Class[3];
paramTypes[0] = String.class;
paramTypes[1] = String.class;
paramTypes[2] = Message.class;

Method setLine1Number = classToInvestigate.getMethod("setLine1Number", paramTypes);
boolean accessible = setLine1Number.isAccessible();
setLine1Number.setAccessible(true);

Object TestReturn = setLine1Number.invoke(gsmObj, arglist);
于 2012-09-14T11:00:41.013 に答える