-
タイトルを見たときに私が何を書こうとしているのかすでにわかっている場合は、あなたのスキルが私よりまだ優れているように思えますが、混乱している場合は、注意深く読んでください。
まずシングルトン パターンを書いてみましょう。
プレーンコピーをクリップボードプリントに表示しますか?
パッケージ test.reflect;
パブリック クラス シングルトン {
プライベート静的シングルトン s= null;
プライベートシングルトン() {
}
public static Singleton getInstance() {
if (s == null) {
同期化 (Singleton.class) {
if (s == null) {
s = 新しいシングルトン();
}
}
}
を返します。
}
}
パッケージ test.reflect;
パブリック クラス シングルトン {
プライベート静的シングルトン s= null;
プライベートシングルトン() {
}
public static Singleton getInstance() {
if (s == null) {
同期化 (Singleton.class) {
if (s == null) {
s = 新しいシングルトン();
}
}
}
を返します。
}
}
この Singleton クラスは単一インスタンス モデルであり、その構築メソッドはプライベートに変更されます。外部クラスは、静的メソッド getIntance を呼び出すことによってのみインスタンスを作成し、複数の呼び出しでそれを返すことはできません。冗長インスタンスを作成します。
弊社のクライアントは以下の通りです。
プレーンコピーをクリップボードプリントに表示しますか?
シングルトン シングルトン = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();これは機能しません
シングルトン シングルトン = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();これは機能しません
印刷結果は以下のようになります。
プレーンコピーをクリップボードプリントに表示しますか?
test.reflect.Singleton@c17164
test.reflect.Singleton@c17164
しかし、プライベート コンストラクターを使用してインスタンスを作成するにはどうすればよいでしょうか?その答えはリフレクションです。
リフレクティブ Java は重要なモジュールです。リフレクションを理解すると、多くの作業が可能になります。リフレクションの基本原理は、クラスのバイトコードを、クラスに関するさまざまな情報を記述することができる Class オブジェクトにマップすることです。
以下にクライアント側にコードを追加します。
プレーンコピーをクリップボードプリントに表示しますか?
シングルトン シングルトン = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();これは機能しません
クラス<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//これも機能します
Constructor<?>[]constructors = clazz.getDeclaredConstructors();//宣言されたコンストラクターを取得する
Constructor<?> privateConstructor =constructors[0];//Singleton クラスにはコンストラクターが 1 つだけあります
privateConstructor.setAccessible(true);//accessibleをtrueに設定して動作させる
シングルトン インスタンス = (シングルトン) privateConstructor.newInstance();
System.out.println(インスタンス);
System.out.println(singleton == インスタンス);
シングルトン シングルトン = Singleton.getInstance();
System.out.println(singleton);
//singleton = new Singleton();これは機能しません
クラス<?> clazz = Singleton.class;
//Class<?> clazz = Class.forName("test.reflect.Singleton");//これも機能します
Constructor<?>[]constructors = clazz.getDeclaredConstructors();//宣言されたコンストラクターを取得する
Constructor<?> privateConstructor =constructors[0];//Singleton クラスにはコンストラクターが 1 つだけあります
privateConstructor.setAccessible(true);//accessibleをtrueに設定して動作させる
シングルトン インスタンス = (シングルトン) privateConstructor.newInstance();
System.out.println(インスタンス);
System.out.println(singleton == インスタンス);
印刷結果は次のとおりです。
プレーンコピーをクリップボードプリントに表示しますか?
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
間違い
test.reflect.Singleton@c17164
test.reflect.Singleton@1fb8ee3
間違い
2 回作成されたオブジェクトが異なることがわかります。プライベート コンストラクター メソッドを通じて Singleton クラスのインスタンスを作成しました。
この記事は CSDN ブログからのものです。転載する場合は出典を明記してください: http://blog.csdn.net/liuhe688/archive/2009/12/31/5110637.aspx
-