为什么getMethod()会抛出此异常?

时间:2014-08-10 13:37:59

标签: java reflection

我正在动态加载一个对象并在java中执行它的一个方法。

URLClassLoader ucl = new URLClassLoader(classUrls);
c = ucl.loadClass(classname);
theParser = c.newInstance();
Object temp = theParser;
Class a = c;
//  Method m = c.getMethod("constructorCore",
//          uk.ac.rhul.csle.text.Text.class);
Method[] allMethods = c.getDeclaredMethods();
String fmt = "%24s: %s%n";
for (Method m : allMethods) {

    System.out.format("%s%n", m.toGenericString());

    System.out.format(fmt, "ReturnType", m.getReturnType());
    System.out.format(fmt, "GenericReturnType",
            m.getGenericReturnType());

    Class<?>[] pType = m.getParameterTypes();
    Type[] gpType = m.getGenericParameterTypes();
    for (int i = 0; i < pType.length; i++) {
        System.out.format(fmt, "ParameterType", pType[i]);
        System.out.format(fmt, "GenericParameterType", gpType[i]);
    }

    Class<?>[] xType = m.getExceptionTypes();
    Type[] gxType = m.getGenericExceptionTypes();
    for (int i = 0; i < xType.length; i++) {
        System.out.format(fmt, "ExceptionType", xType[i]);
        System.out.format(fmt, "GenericExceptionType", gxType[i]);
    }
}

我从http://docs.oracle.com/javase/tutorial/reflect/member/methodType.html得到了for循环,它告诉我类中方法的类型是什么。

使用的两种方法是(由此代码输出):

public void imp.GLLParser.constructorCore(int)
              ReturnType: void
       GenericReturnType: void
           ParameterType: int
    GenericParameterType: int
public void imp.GLLParser.constructorCore(uk.ac.rhul.csle.text.Text)
              ReturnType: void
       GenericReturnType: void
           ParameterType: class uk.ac.rhul.csle.text.Text
    GenericParameterType: class uk.ac.rhul.csle.text.Text 

但是当我运行该行(目前已注释)时

Method m = c.getMethod("constructorCore",
                uk.ac.rhul.csle.text.Text.class);

我得到例外:

java.lang.NoSuchMethodException: imp.GLLParser.constructorCore(uk.ac.rhul.csle.text.Text)
    at java.lang.Class.getMethod(Class.java:1773)
    at dynamicParser.GLLParser.<init>(GLLParser.java:46)

这让我疯了。

如果我使用

 Method m = c.getMethod("constructorCore",
                    int.class);

我可以调用int版本没问题。

发生了什么以及如何解决?

0 个答案:

没有答案