有没有办法调用没有类对象的类的反射方法?

时间:2012-01-10 20:41:21

标签: java android reflection

我正在尝试访问SMSDispatcher的sendRawPdu方法。 我能够获取方法,但我不能调用它,因为我必须有SMSDispatcher的实例来调用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();
}

此任务是否有可能的解决方案?

2 个答案:

答案 0 :(得分:2)

请参阅Method#invoke(java.lang.Object, java.lang.Object...)

的文档
  

如果底层方法是实例方法,则使用动态方法查找调用它,如Java语言规范,第二版,第15.12.4.4节中所述;特别是,将发生基于目标对象的运行时类型的覆盖。

     

抛出:
    NullPointerException - 如果指定的对象为null且方法是实例方法。

因此,基本上如果您传递null以调用实例方法,那么您将收到一个NPE。这意味着在没有对象的情况下调用实例方法是不可能的。这是有道理的,因为你为什么要在没有实例的情况下调用实例方法。

e.g。

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,但打印出“Hello Java Reflection !!!”如果我将方法设为静态。

答案 1 :(得分:0)

SMSDispatcher是一个抽象类,因此您无法获取它的实例。

public abstract class SMSDispatcher extends Handler {...}

尝试使用其他人。