2016-04-15 25 views
-1

なぜリフレクションは、以下のコードでプライベートコンストラクタを破ることによってシングルトンパターンを破ることができないのですか? InstanctTwoに新しいインスタンスがあるはずですが、存在しません。Javaのリフレクションとシングルトン

Constructor[] constructors = EagerInitializedSingleton.class.getDeclaredConstructors(); 
for (Constructor constructor : constructors) { 
    //Below code will destroy the singleton pattern 
    constructor.setAccessible(true); 
    instanceTwo = (EagerInitializedSingleton) constructor.newInstance(); 
    break; 
} 
+1

ことができることを確認して(私はそれが他のケースで動作するかどうかについてはコメントをしません)。なぜそれはできないと思いますか? –

+1

'EagerInitializedSingleton'が' enum'の場合は可能ですか? (それはそうではありませんが、コードは実際にはありません)。私は、洗練されたシリアライゼーションやリフレクション攻撃があっても、複数のインスタンス化に対する厳しい保証について、ジョシュ・ブロッホが言っていることを聞いています。 –

+0

instanceTwoのハッシュを出力する際に​​nullポインタ例外が発生します。 EagerInitializedSingletonは、名前が示すようにsingleTonです。これはenumではありません。 –

答えて

1

EagerInitializedSingletonがenumの場合は動作しません。

class Ideone 
{ 
    enum EagerInitializedSingleton { INSTANCE } 

    public static void main (String[] args) throws java.lang.Exception 
    { 
     Constructor[] constructors = EagerInitializedSingleton.class.getDeclaredConstructors(); 
     for (Constructor constructor : constructors) { 
      //Below code will destroy the singleton pattern 
      constructor.setAccessible(true); 
      System.out.println((EagerInitializedSingleton) constructor.newInstance()); 
     } 
    } 
} 

Ideone demo

Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:416) 
    at Ideone.main(Main.java:19) 
+0

その列挙型ではありません。そのシングルトンクラスと私は名前が示すようにeager-initializationを使用しています。 –

+0

enum *は熱心に初期化されたシングルトンです。 –

+0

しかしクラスはenumではありません。そのシングルトンクラスと私は、もう一つのインスタンスを作成するためにプライベートコンストラクタを破りたいと思います。 –

関連する問題