java.lang.NoSuchMethodException,其中getDeclaredMethods()以其他方式显示

时间:2011-08-31 04:49:56

标签: java android exception reflection

我的问题很简单。这么简单,我似乎无法弄明白。我正在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}}位于不同的项目中。

5 个答案:

答案 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)

几个可能的原因:

  • 您是否在尝试获取声明的方法时传递了正确的参数?
  • 如果方法不接受任何参数,请尝试传递新的Class [0]而不是null

答案 3 :(得分:0)

确保您在getDeclaredMethod调用中发送了正确的参数列表。 现在你正在发送(Class<?>) null。 getStrings方法的签名是什么?

答案 4 :(得分:-1)

这可能有几个原因,首先,你的src对象可能不是你认为的那个。其次,您可能正在尝试访问私有成员。通过实例化给出这个类的代码会很棒!