0

この質問を投稿しました。これは基本的に、文字列を Java の関数にマップする試みに相当します。を作成して解決しようとしていHashMap <String, Method>ますが、Method.invoke (this, args) を実行しようとするたびに、args は 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取り、それをに実装する場合、メソッドを検索するときにの参照を使用することはできません。interfaceMyAwesomeInterfaceinterfaceMyAwesomeImplementationclassMyAwesomeImplementation

例えば

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

マップの母集団はmyTests表示されていませんが、明らかにthisTestNPEをもたらすテストメソッドが含まれていません。

ここで最初に行うことは、このマップの内容を調べて、要求されたキーが含まれていることを確認することです。

また、メソッドを呼び出して爆発を防ぐ前に、ガード句をオンにしておくことをお勧めします。thisTest

于 2012-08-14T21:41:15.130 に答える
1

この行は、thisResult が null の場合にのみ NPE を生成できます。これは、myTests で thisKey が初期化されていないことを意味します。thisKey の代わりに「aKey」を使用すると、機能するはずです。

于 2012-08-14T21:42:56.900 に答える