web-dev-qa-db-ja.com

クラスで静的メソッドを呼び出す?

たとえば、SomeTypeが静的メソッドを持つClassオブジェクトへの参照があるとします。最初にSomeTypeをインスタンス化せずにそのメソッドを呼び出す方法はありますか?できれば、強い型付けをエスケープしないでください。

編集:わかりました、私はめちゃくちゃになりました。

interface Int{
    void someMethod();
}

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

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

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

13
yanchenko

静的メソッドは、定義により、そのクラスのインスタンスではなく、クラスで呼び出されます。

だからあなたが使うなら:

SomeClass.someStaticMethod()

何もインスタンス化していません(JVMが処理するSomeClassクラス自体のクラスのロードとインスタンス化は別として、スコープの外に出ます)。

これは、すでにインスタンス化されているオブジェクトで呼び出される通常のメソッドとは対照的です。

SomeObject o = someObject; // had to be instantiated *somewhere*
o.someMethod();
25
Yuval Adam

状況は正確にはわかりませんが、クラスのタイプがわからないままクラスで静的メソッドを実行する場合(つまり、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");
34
Alex Beardsley

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, ... );
12
JSBձոգչ

はい。それが静的メソッドのすべてです。呼び出すだけです。 SomeType.yourStaticMethodHere()。

0
Carl Manaster