1

I keep getting this error message:

06-13 18:53:33.839: W/System.err(19893): java.lang.NoSuchMethodException: showIt
06-13 18:53:33.839: W/System.err(19893):    at java.lang.ClassCache.findMethodByName(ClassCache.java:247)
06-13 18:53:33.839: W/System.err(19893):    at java.lang.Class.getDeclaredMethod(Class.java:731)

I'm sure my method exists, I try to start from within a asynctask. This is the method:

public static void showIt(String[] result) {

And this is the code I've tried:

try {
            Class<?> p = Class.forName(executeClass);
            Object t = p.newInstance();

            Method m = p.getDeclaredMethod(executeMethod, p);
            m.invoke(t, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
4

3 回答 3

1

三个问题...

  • getDeclaredMethod 第二个参数必须是 showIt 方法的参数类数组。

  • 因为该方法是静态的,所以将对象传递给 invoke 方法的第一个参数是没有用的。

  • 因为调用方法是可变参数,所以必须将结果包装到 Object[] 中才能作为例外传递。

最后,这是一个工作代码片段。

String[] result = new String[] { "res" };
Class<?> p = Class.forName(executeClass);

Method m = p.getDeclaredMethod("showIt", result.getClass());
m.invoke(null, new Object[] {result});
于 2013-06-13T17:00:17.473 回答
1

Given executeClass = "YourClass"and executeMethod = "showIt",p.getDeclaredMethod(executeMethod, p)是试图找到showIt(YourClass arg),但你有showIt(String[] arg)

试试p.getDeclaredMethod(executeMethod, String[].class)

于 2013-06-13T17:05:12.823 回答
0

你这里有两个错误:

  1. 你必须传递 getDeclaredMethod 参数的类型作为第二个参数,而不是你的类的类型(p)
  2. 由于您的方法是静态的,因此您必须将 null 作为第一个参数传递给调用,并且您不需要创建 t 实例。

.

public class Main {
    public static void main(String[] args){


        try {
            Class<?> p = Main.class;

            String[] arguments = {"ciao"};
            Method m = p.getDeclaredMethod("showIt",String[].class);

            m.invoke(null, arguments);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void showIt(String[] result) {
        System.out.println(result[0]);
    }
}
于 2013-06-13T17:13:14.933 回答