我正在使用反射api从类的实例中调用一个方法。一切都很好,我一步一步地学习了许多教程和官方的oracle文档,但它抛出了NoSuchMethodException
。这是我的代码:
// Part of the main class
Class[] argTypes = new Class[2];
argTypes[0] = HttpServletRequest.getClass();
argTypes[1] = HttpServletResponse.getClass();
Object[] args = new Object[2];
args[0] = request;
args[1] = response;
try {
Class<?> cls = Class.forName("x.xx.xxx.Default");
Object object = cls.newInstance();
Method method = cls.getDeclaredMethod("index", argTypes);
method.invoke(object, args);
} catch (Exception exception) { // for simplicity of the question, I replaced all exception types with Exception
exception.printStackTrace();
}
// End of the main class
// class x.xx.xxx.Default
public class Default {
public void index(HttpServletRequest request, HttpServletResponse response) {
try {
PrintWriter writer = response.getWriter();
writer.println("Welcome");
} catch (IOException exception) {
System.err.println(exception);
}
}
}
这是我在发生异常时对exception
的描述
java.lang.NoSuchMethodException: x.xx.xxx.Default.index(org.apache.catalina.connector.RequestFacade, org.apache.catalina.connector.ResponseFacade)
我认为您需要在运行时传递静态类,而不是类。
Class[] argTypes = new Class[2];
argTypes[0] = HttpServletRequest.class;
argTypes[1] = HttpServletResponse.class;
在以下代码中:
Class[] argTypes = new Class[2];
argTypes[0] = HttpServletRequest.getClass();
argTypes[1] = HttpServletResponse.getClass();
HttpServletRequest
和HttpServletResponse
是变量,因此getClass()
调用具有多态性。
你想写:
Class[] argTypes = new Class[2];
argTypes[0] = HttpServletRequest.class;
argTypes[1] = HttpServletResponse.class;
您正试图在类型为"object"的on对象上调用类"x.xx.xxx.Default"的方法(这是有效的类名吗?)。
我会试试这个:
YourClassType object = (YourClassType) cls.newInstance();
或者类似的东西。我现在不能很好地查找,但我确信你正试图在类型为"object"的对象上调用某个类型的方法,而该对象不知道那个特定的方法。