Есть ли способ вызвать отраженный метод класса, не имеющий объекта класса? - PullRequest
1 голос
/ 11 января 2012

Я пытаюсь получить доступ к методу sendRawPdu в SMSDispatcher. Я могу получить метод, но не могу вызвать его, потому что мне нужен экземпляр 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 ]

2 голосов
/ 11 января 2012

См. Документ для Method#invoke(java.lang.Object, java.lang.Object...)

Если базовый метод является методом экземпляра, он вызывается с использованием динамического поиска метода, как описано в спецификации языка Java, второе издание, раздел 15.12.4.4; в частности, произойдет переопределение на основе типа времени выполнения целевого объекта.

Выдает:
NullPointerException - если указанный объект является нулем, и метод является методом экземпляра.

Итак, в основном, если вы передаете нуль для вызова метода экземпляра, вы получаете 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, но выводит "Hello Java Reflection !!!" если я сделаю метод статичным.

0 голосов
/ 27 августа 2013

SMSDispatcher - абстрактный класс, поэтому вы не можете получить его экземпляр.

public abstract class SMSDispatcher extends Handler {...}

Попробуйте использовать другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...