ID を渡さずにどの Java アプレット コンテキストで実行されているかを識別するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/7269

  •  08-06-2019
  •  | 
  •  

質問

私は、かなり大規模な Swing Java アプレットを開発するチームの一員です。私たちのコードのほとんどはレガシーであり、シングルトン参照が大量にあります。それらすべてを 1 つの「アプリケーション コンテキスト」シングルトンにまとめました。ここで必要なのは、共有コンテキスト (現在表示されているすべてのアプレット間で共有) と非共有コンテキスト (現在表示されている各アプレットに固有) を分離する何らかの方法を作成することです。

ただし、シングルトンを呼び出す各ロケーションに ID があるわけではなく、ID をすべてのロケーションに伝播する必要もありません。どのアプレット コンテキストで実行しているかを識別する最も簡単な方法は何ですか?(クラスローダー、スレッドグループ、スレッドIDをいじってみました...今のところ、通話の発信元を特定できるものは何も見つかりませんでした)。

役に立ちましたか?

解決

シングルトンは悪です、何を期待していますか?;)

おそらく最も包括的なアプローチは、アプレットの大部分を別のクラス ローダーにロードすることです (java.net.URLClassLoader.newInstance を使用します)。次に、WeakHashMap を使用して、クラス ローダーをアプレットに関連付けます。コードの大部分を共通のクラス ローダー (各アプレットごとのクラス ローダーの親として) と通常のアプレット コードベースに分割できれば、速度は上がりますが、作業は多くなります。

その他のハック:

いずれかのコンポーネントにアクセスできる場合は、Component.getParent を繰り返し使用するか、SwingUtilities.getRoot を使用できます。

アプレット インスタンスごとのスレッドを使用している場合は、ThreadLocal を設定できます。

EDT から、キュー (java.awt.EventQueue.getCurrentEvent()) から現在のイベントを読み取り、そこからコンポーネントを見つけることができます。あるいは、オーバーライドされたdispatchEventメソッドを使用してEventQueueをプッシュします。

他のヒント

私の理解が正しければ、呼び出し元オブジェクトまたは「コンテキスト」ごとに異なる「シングルトン」オブジェクトを取得するという考えです。できることの 1 つは、現在のコンテキストの ID を書き込むスレッドローカルのグローバル変数を作成することです。(これは AOP で実行できます。) 次に、シングルトン ゲッターで、コンテキスト ID がスレッドローカルからフェッチされ、呼び出し側コンテキストの正しい「シングルトン」インスタンスへのキーとして使用されます。

AOP に関しては、ポイントカットに応じて、アドバイスがコンパイル時に織り込まれ、JAR が実行時の依存関係に追加されるため、アプレットで使用しても問題ありません。したがって、実行時に AOP の特別な証拠が残ることはありません。

スレッドローカルに関する@Hugo:

その解決策を考えてみました。ただし、実験の結果、このアプローチには 2 つの問題があることがわかりました。

  1. 共有スレッド (サーバー接続など) に問題があります。ただし、これはこれらのスレッドに特別な注意を払うことで解決できます (これらはすべて私の管理下にあり、従来のコードからはほとんど分離されています)。
  2. EDT スレッドはすべてのアプレット間で共有されます。アプレットごとに新しい EDT スレッドを強制的に作成する方法を見つけることができませんでした。これは、EDT のスレッドローカルがアプレット間で共有されることを意味します。これは解決方法がわかりません。提案はありますか?
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top