0
static boolean isClassLoaded(String fullname) {
    try {
        Class.forName(fullname, false, Loader.instance().getModClassLoader());
        return true;
    } catch (Exception e) {
        return false;
    }
}

このメソッドは fullname の静的初期化子をトリガーする可能性がありますか? 2回呼び出された静的初期化子に問題があります。isClassLoaded を使用してクラスがロードされているかどうかを確認し、そのクラスを使用しようとすると、コンストラクターが 2 回呼び出されるためにエラーが発生します。Class.forName(fullname, false, Loader.instance().getModClassLoader()); の何が問題なのか誰でも知っています。?

4

1 に答える 1

1

2 番目のパラメータは「initialize」というフラグです。

ドキュメントから:

クラスは、initialize パラメーターが true で、以前に初期化されていない場合にのみ初期化されます。

したがって、initializeが に設定されている場合false、静的初期化子は実行されません。

自己完結型の例

package test;

public class Main {

    public static void main(String[] args) throws Exception {
        Class.forName("test.Main$Foo", false, Main.class.getClassLoader());
        System.out.println("blah");
        Class.forName("test.Main$Foo", true, Main.class.getClassLoader());
    }

    static class Foo {
        static {
            System.out.println("Foo static initializer");
        }
    }

}

出力

blah
Foo static initializer

Foo static initializer常に1 回だけ出力されることに注意してください。ただし、ここではblah最初に出力されます。つまり、最初のClass.forName呼び出しでは静的初期化子が実行されませんでした。

于 2015-10-09T14:34:49.113 に答える