java.lang.NoSuchMethodException, где getDeclaredMethods () показывает иначе - PullRequest
2 голосов
/ 31 августа 2011

Моя проблема проста.Так просто, я не могу понять это.Я передаю квалифицированное имя класса в BroadcastReceiver как String в Intent.

Цель состоит в том, чтобы создать экземпляр объекта из имени класса с помощью отражения и вызвать метод, который мы знаемсуществует, потому что он реализует собственный интерфейс.Я даже проверяю его на getDeclaredMethods(), который говорит, что он там, но когда я пытаюсь invoke этот метод, он выдает java.lang.NoSuchMethodException.

String myClass = intent.getStringExtra("name");        
Class<?> c = Class.forName(myClass);
Object object = c.newInstance();

// Get the files from the interface

Method ms[] = c.getDeclaredMethods();
for (Method m1 : ms) {
    Log.i("METHOD", "METHODS " + m1.getName());
}

Method m = c.getDeclaredMethod("getStrings", (Class<?>) null);
String[] someStrings = (String[]) m.invoke(object, (Object[]) null);

m = c.getDeclaredMethod("getThings", (Class<?>) null);
Thing[] things = (Thing[]) m.invoke(object, (Object[]) null);

Вот вывод LogCat:

08-30 23:37:36.150: INFO/METHOD(2336): METHODS getStrings
08-30 23:37:36.150: INFO/METHOD(2336): METHODS getThings
08-30 23:37:36.150: WARN/System.err(2336): java.lang.NoSuchMethodException: getStrings
08-30 23:37:36.150: WARN/System.err(2336):     at java.lang.ClassCache.findMethodByName(ClassCache.java:247)
08-30 23:37:36.150: WARN/System.err(2336):     at java.lang.Class.getDeclaredMethod(Class.java:731)
08-30 23:37:36.150: WARN/System.err(2336):     at com.app.MyBroadcastReceiver.onReceive(MyBroadcastReceiver.java:45)
08-30 23:37:36.150: WARN/System.err(2336):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:1794)
08-30 23:37:36.150: WARN/System.err(2336):     at android.app.ActivityThread.access$2400(ActivityThread.java:117)
08-30 23:37:36.150: WARN/System.err(2336):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:981)
08-30 23:37:36.150: WARN/System.err(2336):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-30 23:37:36.160: WARN/System.err(2336):     at android.os.Looper.loop(Looper.java:130)
08-30 23:37:36.160: WARN/System.err(2336):     at android.app.ActivityThread.main(ActivityThread.java:3683)
08-30 23:37:36.160: WARN/System.err(2336):     at java.lang.reflect.Method.invokeNative(Native Method)
08-30 23:37:36.160: WARN/System.err(2336):     at java.lang.reflect.Method.invoke(Method.java:507)
08-30 23:37:36.160: WARN/System.err(2336):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-30 23:37:36.160: WARN/System.err(2336):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-30 23:37:36.160: WARN/System.err(2336):     at dalvik.system.NativeStart.main(Native Method)

Есть ли что-то, чего мне здесь не хватает?

Редактировать: Добавлен код в класс

public class MyClass implements MyInterface {

    @Override
    public String[] getStrings() {
        // Stub
        return new String[2];
    }

    @Override
    public Thing[] getThings() {
        // Stub
        return new Thing[2];
    }

}

Примечание: BroadcastReceiver и Class находятся вразные проекты.

Ответы [ 5 ]

4 голосов
/ 31 августа 2011

getDeclaredMethod требует, чтобы вы указали правильные параметры. Если параметров нет, вместо того, чтобы передавать «ноль», вам нужно передать абсолютно ничего.

Например, вот фрагмент кода для hashCode, который не принимает аргументов

Method m = c.getDeclaredMethod("hashCode");
System.out.println("test");
Method m2 = c.getDeclaredMethod("hashCode", (Class<?>) null);

он выведет «test», затем выдаст исключение MethodNotFound, поскольку hashCode не принимает аргументов. Если вы хотите получить как типы аргументов, так и имя, выполните getParameterTypes для объекта метода

for (Method m1 : ms) {
    System.out.println( "METHODS " + m1.getName());
    for (Class paramC : m1.getParameterTypes()) {
        System.out.println(paramC.getName());
    }
    }
1 голос
/ 31 августа 2011

Несколько возможных причин:

  • Вы передаете правильные параметры, пытаясь получить объявленный метод?
  • Если метод не принимает никаких параметров, попробуйте передать новый класс [0] вместо нуля
1 голос
/ 31 августа 2011

Это может помочь.http://code.google.com/p/android/issues/detail?id=2812

Опубликовать комментарий или отредактировать исходное сообщение, если оно не совпадает, с более подробной информацией.:)

Поток, который я связал выше, об ошибке в платформе, вызывающей другие подобные проблемы.

0 голосов
/ 31 августа 2011

Убедитесь, что вы отправляете правильный список параметров в вызове getDeclaredMethod.Прямо сейчас вы отправляете (Class<?>) null.Какая сигнатура метода getStrings?

0 голосов
/ 31 августа 2011

для этого может быть несколько причин, во-первых, ваш src-объект может быть не тем, о котором вы думали. Во-вторых, вы можете пытаться получить доступ к частному члену. Дать код этого класса, чтобы создать экземпляр, было бы здорово!

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