49

この質問は Google のいたるところで聞かれますが、まだ問題があります。これが私がやろうとしていることです。私のタイトルの状態のように、「オブジェクトはクラスを宣言するインスタンスではありません」というエラーが表示されます。何か案は?ありがとう!

Main.java

Class<?> base = Class.forName("server.functions.TestFunction");
Method serverMethod = base.getMethod("execute", HashMap.class);
serverMethod.invoke(base, new HashMap<String, String>());

TestFunction.java

package server.functions;

import java.util.HashMap;
import java.util.Map;

import server.*;

public class TestFunction extends ServerBase {

    public String execute(HashMap<String, String> params)
    {
        return "Test function successfully called";
    }
}
4

2 に答える 2

72

クラスでメソッドを呼び出していますが、そのインスタンスが必要です。これを試して:

serverMethod.invoke(base.newInstance(), new HashMap<String, String>());
于 2012-11-11T22:23:18.477 に答える
17

executeobject でメソッドを呼び出そうとしていますbaseが、これは実際には呼び出しClassによって返されたオブジェクトClass.forName()です。

これはstatic(クラス)メソッドで機能しexecuteますが、非静的(インスタンス)メソッドです。

(型のオブジェクトのインスタンス メソッドを呼び出す場合にも機能しますClassが、ここで達成しようとしているのはそれではありません!)

メソッドを呼び出すには の実際のインスタンスが必要です。TestFunctionまたは、メソッドを作成する必要がありますstatic

リフレクションによって静的メソッドを呼び出す場合、 の最初の引数invoke()は無視されるため、 に設定するのが慣例でnullあり、これにより、インスタンスが関与しないという事実が明確になります。

現在のサンプル メソッドはどのTestFunctionオブジェクトに対しても同じことを行いますが、通常、インスタンス メソッドはオブジェクトごとに異なる結果を生成する可能性があるため、.invoke()リフレクション メソッドはメソッドを実行するオブジェクトを認識する必要があります。

于 2012-11-11T22:22:54.250 に答える