0

我发布了这个问题,基本上相当于尝试将字符串映射到 Java 中的函数。我试图通过创建HashMap <String, Method>一个NullPointerException. 我在 my 中声明方法HashMap如下:mypackage.MyClass.class.getMethod ("methodName", args),其中是与 的参数对应args的对象数组。我已经为此工作了几个小时,我开始感到非常沮丧。如果有人有任何建议,我将不胜感激!ClassmethodName

HashMap <String, Method> myMethods = new HashMap <String, Method> (); 
Class [] args = {param1.class, param2.class, param3.class}; 
myMethods.put ("aKey", mypackage.MyClass.class.getMethod ("aMethod", args)); 
Method thisTest = myTests.get (thisKey);
Object [] args1 = {param1, param2, param3};
String thisResult = (String) thisTest.invoke (this, args1); // NPE occurs in this line

Aug 14, 2012 10:37:36 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
        at mypackage.MyClass.myMethod (MyClass.java:61)
        at org.apache.jsp.myMethod_jsp._jspService(getZabbix_jsp.java:70)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Unknown Source)
4

3 回答 3

2

在处理反射时,您需要非常小心。

Class参数必须与您正在搜索的声明完全匹配method

例如,如果您有一个method采用interfaceof 的a 并且您在您的 中MyAwesomeInterface实现它,则在查找该方法时不能使用引用 of 。interfaceMyAwesomeImplementationclassMyAwesomeImplementation

例如

getClass().getMethod("doAwesomeness", new Class[] {MyAwesomeImplementation.class});

不会工作。这个需要MyAwesomeInterface.class

我把这个小例子放在一起,效果很好

public String methodToBeInvoked(String value, int iValue) {

    return "You said " + value + " with " + iValue;

}

public MethodInvocation() {

    Map<String, Method> myMethods = new HashMap<String, Method>(25);
    try {

        Method method = getClass().getMethod("methodToBeInvoked", new Class[]{String.class, int.class});

        myMethods.put("invoke", method);

        System.out.println(myMethods.get("invoke").invoke(this, "Hello", 100));

    } catch (Exception exp) {

        exp.printStackTrace();

    }
}

我怀疑class您用于查找方法的参数与方法声明不匹配。

确保当您查找它以及尝试将其从地图中拉出时不是,这将有助于缩小问题method范围null

于 2012-08-14T21:40:38.117 回答
1

虽然没有显示 Map 的总体myTests,但它显然不包含thisTest导致 NPE 的测试方法。

这里要做的第一件事是检查这个 Map 的内容,以确保它包含请求的密钥。

此外,在您尝试调用该方法以防止它爆炸之前,值得拥有一个保护子句。thisTest

于 2012-08-14T21:41:15.130 回答
1

此行只能在 thisResult 为 null 的情况下产生 NPE,这反过来意味着 thisKey 未在 myTests 中初始化。使用“aKey”而不是 thisKey,它应该可以工作。

于 2012-08-14T21:42:56.900 回答