我正在尝试访问SMDispatcher的sendRawPdu方法。我可以获得方法,但不能调用它,因为我必须有SMSDatcher的实例才能调用mSendRawPdu.invoke( /* ??? */ , pdus.encodedScAddress, pdus.encodedMessage, null, null );
从SmsManager调用该方法非常有效,因为我可以获得这样的SmsManager sm = SmsManager.getDefault();
对象并将其传递给.invoke
try {
@SuppressWarnings("rawtypes")
Class c = Class.forName("com.android.internal.telephony.SMSDispatcher");
Method[] ms = c.getDeclaredMethods();
// List all methods
for (int i = 0; i < ms.length; i++) {
Log.d("ListMethos",ms[i].toString());
}
// Get method "sendRawPdu"
byte[] bb = new byte[1];
Method mSendRawPdu = c.getDeclaredMethod("sendRawPdu",bb.getClass(),bb.getClass(), PendingIntent.class, PendingIntent.class);
Log.d("success","success getting sendRawPdu");
mSendRawPdu.setAccessible(true);
// How to invoke the method not having object of type SMSDispatcher?
mSendRawPdu.invoke( /* ??? */ , pdus.encodedScAddress, pdus.encodedMessage, null, null );
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这项任务有可能的解决方案吗?
参见Method#invoke(java.lang.Object, java.lang.Object...)
文档
如果底层方法是实例方法,则使用Java语言规范第二版第15.12.4.4节中所述的动态方法查找来调用它;特别是,将发生基于目标对象的运行时类型的覆盖。
投掷:
NullPointerException-如果指定的对象为null,并且该方法是实例方法。
所以,基本上,如果您传递一个null来调用一个实例方法,那么您就会收到一个NPE。这意味着不可能在没有对象的情况下调用实例方法。这是有道理的,因为您为什么要在没有实例的情况下调用实例方法。
例如
class MyClass {
public void myMethod() {
System.out.println("Hello Java Reflection!!!");
}
}
Method theMethod = MyClass.class.getDeclaredMethod("myMethod");
System.out.println(theMethod);
theMethod.setAccessible(true);
theMethod.invoke(null);
它抛出一个NPE,但打印";你好Java反射"如果我使该方法为静态的。
SMSDatcher是一个抽象类,因此您无法获得它的实例。
public abstract class SMSDispatcher extends Handler {...}
试着利用别人。