たとえば、SomeTypeが静的メソッドを持つClassオブジェクトへの参照があるとします。最初にSomeTypeをインスタンス化せずにそのメソッドを呼び出す方法はありますか?できれば、強い型付けをエスケープしないでください。
編集:わかりました、私はめちゃくちゃになりました。
interface Int{
void someMethod();
}
class ImplOne implements Int{
public void someMethod() {
// do something
}
}
Class<? extends Int> getInt(){
return ImplOne.class;
}
この場合、someMethod()はとにかく静的にすることはできません。
静的メソッドは、定義により、そのクラスのインスタンスではなく、クラスで呼び出されます。
だからあなたが使うなら:
SomeClass.someStaticMethod()
何もインスタンス化していません(JVMが処理するSomeClass
クラス自体のクラスのロードとインスタンス化は別として、スコープの外に出ます)。
これは、すでにインスタンス化されているオブジェクトで呼び出される通常のメソッドとは対照的です。
SomeObject o = someObject; // had to be instantiated *somewhere*
o.someMethod();
状況は正確にはわかりませんが、クラスのタイプがわからないままクラスで静的メソッドを実行する場合(つまり、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");
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, ... );
はい。それが静的メソッドのすべてです。呼び出すだけです。 SomeType.yourStaticMethodHere()。