ホームページ  >  記事  >  Java  >  Java での列挙型シングルトン パターンとソース コード分析の例

Java での列挙型シングルトン パターンとソース コード分析の例

黄舟
黄舟オリジナル
2017-08-08 09:57:041523ブラウズ

この記事は主に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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。