2009-06-02 18 views
10

静的メソッドを持つSomeTypeを持つClassオブジェクトへの参照があります。 SomeTypeを最初にインスタンス化してそのメソッドを呼び出す方法はありますか?強く入力することは避けてください。クラスで静的メソッドを呼び出す?

EDIT:OK、私は台無しにしました。

interface Int{ 
    void someMethod(); 
} 

class ImplOne implements Int{ 
    public void someMethod() { 
     // do something 
    } 
} 

Class<? extends Int> getInt(){ 
    return ImplOne.class; 
} 

この場合someMethod()は静的にすることはできません。

+0

私はこの質問は実際にはJavaのリフレクションについてだと思いますが、実際は明らかではありません。 –

+0

うーん、そうは思わない。 –

答えて

24

に静的メソッドを、定義によって、クラスではなく、そのクラスのインスタンスで呼び出されます。あなたが使用している場合

だから:

SomeClass.someStaticMethod() 

あなたは(JVMが処理し、あなたの範囲外の道である、脇SomeClassクラス自体のクラスのロードとインスタンス化を残して)何もインスタンス化されていません。

これはすでにインスタンス化されているオブジェクトで呼び出さ通常の方法に反対している:

SomeObject o = someObject; // had to be instantiated *somewhere* 
o.someMethod(); 
+2

Eclipse(とかなりのIDE)は、インスタンス構文(「静的メンバーへの非静的アクセス」と呼ばれます)を使用して静的メソッドを呼び出す場合に警告することさえ提供します。これはエラーではありませんが、明示的に静的なアクセスを使用するよりもはるかに明確ではありません。 –

+1

私は、Sunのコンパイラ自体もこの警告を発行していると思います。私はそれがエラーになる必要があるほど混乱していると信じています:http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an- error-for-the-java-comのエラー – Thilo

24

状況は分かりませんが、クラスの型を知らなくてもクラスに対して静的メソッドを実行しようとしている場合(つまり、SomeTypeであることがわからない場合は、Classオブジェクトあなたはリフレクションを使用してこれを行うことができ名とメソッドのパラメータを知っている場合)、:

Class c = getThisClassObjectFromSomewhere(); 

//myStaticMethod takes a Double and String as an argument 
Method m = c.getMethod("myStaticMethod", Double.class, String.class); 
Object result = m.invoke(null, 1.5, "foo"); 
-1

はい。それが静的メソッドのすべてです。ちょうどそれを呼び出します。 SomeType.yourStaticMethodHere()。

10

Classオブジェクトについて話をしたので、Javaリフレクションに興味があると思います。

Class someClass = SomeType.class; 
Method staticMethod = someClass.getMethod("methodName", ...); 

// pass the first arg as null to invoke a static method 
staticMethod.invoke(null, ...); 
関連する問題