2012-11-11 29 views
23

この質問はGoogleのどこでも尋ねられていますが、まだ問題があります。ここに私がやろうとしていることがあります。だから私のタイトル状態のように、私は 'オブジェクトがクラスの宣言のインスタンスではありません'エラーを取得しています。何か案は?ありがとう!Java Reflection - オブジェクトは宣言クラスのインスタンスではありません

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"; 
    } 
} 

答えて

37

クラスを使用してメソッドを呼び出していますが、そのインスタンスが必要です。これを試してください:あなたはまた、提供することができ、静的メソッドの場合

serverMethod.invoke(base.newInstance(), new HashMap<String, String>()); 
+0

完全に働いた。ありがとう – tier1

+0

ちょうど私が必要なもの、ありがとう! –

10

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

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

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

TestFunctionオブジェクトの場合、同じメソッドを実行しますが、通常はインスタンスメソッドによってオブジェクトごとに異なる結果が生成される可能性があります。つまり、.invoke()リフレクトメソッドは、メソッドを実行するオブジェクトを知る必要があります。

+0

を 'null'なので... –

+0

はい確かに、[のJavaDoc]で説明したように(http://docs.oracle.com/javase/6/docs/ api/java/lang/reflect/Method.html#invoke%28java.lang.Object、%20java.lang.Object ...%29)。 – DNA

+0

詳細な説明をありがとう。私はこの質問に対して複数の正解を選ぶことができたらいいと思う。 – tier1