1

クラスをロードするとき、メソッドを使用して、クラス内のforName()静的なinitializersものが実行されます。これを防ぐことはできますか?

try {
        Class.forName("MYClass");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

私のクラス

class MyClass{

static String TEST="MYCLASS";
static SomeClass sm=new SomeClass();
}

私はドキュメントでClass.forName()のオーバーロードされたバージョンがあることを発見しました。

public static Class<?> forName(String name,
                           boolean initialize,
                           ClassLoader loader)
                    throws ClassNotFoundException

initializeパラメータとは何ですか?

4

2 に答える 2

0

これはJavaがオブジェクトを作成する方法なので、いいえ。1 つの方法は、別の時点でインスタンスを遅延ロードすることです。

これは、静的参照を削除する必要があることを意味します。

例えば

public SomeClass getSomeClass() {
   if (sm == null) {
      return new SomeClass();
   }

   return sm;

}
于 2012-06-14T13:46:59.307 に答える
0

静的初期化を実行したくない場合は、Class.forName の代わりにクラス リテラルを試してください。

class A1{
    static{
        System.out.println("static block from A1");
    }
}

class B1{
    public static void main(String[] args) throws ClassNotFoundException {
//      Class.forName("A1");//this will invoke static initialization
        Class c=A1.class;//this will not invoke static initialization
    }
}
于 2012-06-14T13:50:29.693 に答える