18

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

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

interface Int{
    void someMethod();
}

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

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

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

4

4 に答える 4

39

状況が正確にはわかりませんが、クラスの型を知らずにクラスで静的メソッドを実行しようとしている場合 (つまり、それが 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");
于 2009-06-02T22:54:57.250 に答える
30

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

したがって、次を使用する場合:

SomeClass.someStaticMethod()

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

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

SomeObject o = someObject; // had to be instantiated *somewhere*
o.someMethod();
于 2009-06-02T22:56:20.413 に答える
14

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, ... );
于 2009-06-02T23:07:28.847 に答える
0

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

于 2009-06-02T22:57:45.093 に答える