我正在动态加载一个对象并在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
版本没问题。
发生了什么以及如何解决?