我的问题很简单。这么简单,我似乎无法弄明白。我正在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);
。
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)
这是LogCat输出:
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
和{{1}}位于不同的项目中。
答案 0 :(得分:4)
getDeclaredMethod要求您提供正确的参数。如果没有参数,那么你不需要传递“null”,而是绝对不需要传递任何参数。
例如,这是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 :(得分:1)
这可能会有所帮助。 http://code.google.com/p/android/issues/detail?id=2812
发布评论或编辑您的原始帖子,如果它们不相同,具体细节。 :)
我上面链接的主题是关于平台的错误导致其他类似的问题。
答案 2 :(得分:1)
几个可能的原因:
答案 3 :(得分:0)
确保您在getDeclaredMethod调用中发送了正确的参数列表。
现在你正在发送(Class<?>) null
。 getStrings方法的签名是什么?
答案 4 :(得分:-1)
这可能有几个原因,首先,你的src对象可能不是你认为的那个。其次,您可能正在尝试访问私有成员。通过实例化给出这个类的代码会很棒!