Моя проблема проста.Так просто, я не могу понять это.Я передаю квалифицированное имя класса в 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
находятся вразные проекты.