この記事は主にJAVA列挙シングルトンモードとソースコード分析の詳細な例に関する関連情報を紹介します
JAVA列挙シングルトンモードとソースコード分析の例の詳細な説明
シングルトンモードはたくさんあります。単一インタレスト モードを実装するには列挙型を使用するのが最善であるとインターネットでも分析されています。
1. スレッドの安全性
2.シリアル化により生成される
3 .リフレクション攻撃を防ぐが、ENUM シングルトンが上記の 3 つの点をどのように達成するかを説明した記事はないようです。これらの 3 つの点を説明してください:
スレッドの安全性の最初の点については、次のことが考えられます。逆コンパイルされたクラスのソースコードから見ると、クラスロード機構でもこうなることが保証されています(解決済み) 2つ目のシリアル化の問題については、列挙型クラス自体がreadResolve()メソッドを実装しているという記事があるので、シリアル化に強いです このメソッドは現在のクラスです 自分で実装しました(解決)
3点目のリフレクション攻撃については、以下のようなリフレクション攻撃を自分で試しましたが、エラーが報告されました... 逆コンパイルされたクラスのソースコードを読んだところ、以下、シングルトンクラスの変更は抽象クラスなのでインスタンス化できないのでわかります。 (解決策)
以下は私が書いた列挙型シングルトンと、そのクラスファイルを逆コンパイルした後のクラスです
列挙型シングルトン
public enum Singleton { INSTANCE { @Override protected void read() { System.out.println("read"); } @Override protected void write() { System.out.println("write"); } }; protected abstract void read(); protected abstract void write(); }
public abstract class Singleton extends Enum { private Singleton(String s, int i) { super(s, i); } protected abstract void read(); protected abstract void write(); public static Singleton[] values() { Singleton asingleton[]; int i; Singleton asingleton1[]; System.arraycopy(asingleton = ENUM$VALUES, 0, asingleton1 = new Singleton[i = asingleton.length], 0, i); return asingleton1; } public static Singleton valueOf(String s) { return (Singleton)Enum.valueOf(singleton/Singleton, s); } Singleton(String s, int i, Singleton singleton) { this(s, i); } public static final Singleton INSTANCE; private static final Singleton ENUM$VALUES[]; static { INSTANCE = new Singleton("INSTANCE", 0) { protected void read() { System.out.println("read"); } protected void write() { System.out.println("write"); } }; ENUM$VALUES = (new Singleton[] { INSTANCE }); } }
以上がJava での列挙型シングルトン パターンとソース コード分析の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。