gpt4 book ai didi

java - 如何正确使用反射访问 Telephony Manager 中的隐藏方法

转载 作者:行者123 更新时间:2023-11-30 11:47:19 25 4
gpt4 key购买 nike

我不确定是反射本身有问题,还是我尝试获取的方法有问题。

我想做的是从类中调用函数 setLine1Number:

com.android.internal.telephony.gsm.GSMPhone

这样我就可以将我的号码正确插入我的手机中,因为它不需要在我的 SIM 卡中。因此,我希望能够调用函数 getLine1Number 并让它返回我设置的相同号码。

反射似乎是能够使用此函数的唯一方法,因为它不在公共(public) 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();

并让它返回我输入的数字。但正如我所说的非法参数异常,我不确定如何解决这个问题。任何帮助表示赞赏。我对反射(reflection)还很陌生,所以这可能是一个简单的问题。

错误日志如下:

Error Log


还有一件事我忘了说,我使用了下面的代码来检查这个方法是否真的存在于类文件中:

        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。所以我相当有信心它就在那里,我可以以某种方式使用它。

最佳答案

您需要一个您希望操作的类的实例 - 一个已经创建的该类型的对象。

您将其传递给 setLine1Number.invoke()

例如,如果我们正在处理 Integer 类,您会说:

Integer i = new Integer(5);
...
Object TestReturn = someIntegerMethod.invoke(i, arglist);

关于java - 如何正确使用反射访问 Telephony Manager 中的隐藏方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9369648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com