使用反射api时抛出NoSuchMethodException

时间:2013-06-27 09:35:11

标签: java exception reflection

我正在使用reflection 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)

3 个答案:

答案 0 :(得分:3)

我相信你需要在运行时传递静态类而不是类。

Class[] argTypes = new Class[2];
argTypes[0] = HttpServletRequest.class;
argTypes[1] = HttpServletResponse.class;

答案 1 :(得分:2)

在以下代码中:

Class[] argTypes = new Class[2];
argTypes[0] = HttpServletRequest.getClass();
argTypes[1] = HttpServletResponse.getClass();

HttpServletRequestHttpServletResponse是变量,因此getClass()调用受多态影响。

你想写:

Class[] argTypes = new Class[2];
argTypes[0] = HttpServletRequest.class;
argTypes[1] = HttpServletResponse.class;

答案 2 :(得分:0)

您正在尝试在“对象”类型的on对象上调用clas“x.xx.xxx.Default”(是一个有效的类名吗?)的方法。

我会试试这个:

YourClassType object = (YourClassType) cls.newInstance();

或类似的东西。我现在无法进行良好的查找,但我很肯定您正试图在“对象”类型的对象上调用某种类型的方法,该对象不知道该特定方法。