削除予定の非推奨となったメソッドSubject::getSubjectおよびSubject::doAsのSubject::currentおよびSubject::callAsへの移行

次のメソッドは、削除予定の非推奨となったセキュリティ・マネージャAPIに依存しているため、削除予定の非推奨になりました。

  • Subject getSubject(AccessControlContext)
  • T doAs(Subject, PrivilegedAction<T>)
  • T doAs(Subject, PrivilegedExceptionAction<T>)
  • T doAsPrivileged(Subject, PrivilegedAction<T>, AccessControlContext)
  • T doAsPrivileged(Subject, PrivilegedExceptionAction<T>, AccessControlContext)

これらのメソッドは、Subject current()およびT callAs(Subject, Callable<T>)に加えて、セキュリティ・マネージャが許可されるかどうかに応じて動作が異なります:

表6-5 Subjectメソッド間の動作の違い

メソッド セキュリティ・マネージャは許可されています セキュリティ・マネージャは許可されていません
getSubject 以前のリリースと比較して動作は変更されません。 メソッドは、UnsupportedOperationExceptionをスローします。

このメソッドは、セキュリティ・マネージャと連動して削除予定の非推奨となったAccessControlContextクラスに依存します。

current 以前のリリースと比較して動作は変更されません。 現在のスレッドの実行期間にバインドされたSubjectを返します。
doAsおよびdoAsPrivileged 以前のリリースと比較して動作は変更されません。

メソッドによって、指定されたSubjectが現在のスレッドのAccessControlContextに関連付けられ、PrivilegedActionまたはPrivilegedExceptionActionが実行されます。これにより、Subjectとしてアクションを実行させる効果を実現します。

Subjectは、現在のスレッドのAccessControlContextに関連付けられていません。かわりに、これらのメソッドは、アクションのバインドされた期間実行の現在のSubjectとしてSubjectを使用したアクションを起動します。
callAs アクション引数Callable<T>およびスローされた例外CompletedExceptionのタイプが異なることを除き、doAsと同じように動作します(セキュリティ・マネージャが許可されています)。 アクション引数Callable<T>およびスローされた例外CompletedExceptionのタイプが異なることを除き、doAsと同じように動作します(セキュリティ・マネージャが許可されていません)。

ノート:

システム・プロパティjava.security.managerの値が空の行、クラス名または値allowにコマンドラインで設定されている場合は、セキュリティ・マネージャは許可されています。java.security.managerの値が設定されていないか、値disallowに設定されている場合は、セキュリティ・マネージャは許可されていません。

doAsおよびdoAsPrivilegedメソッドの動作が、セキュリティ・マネージャが許可されているかどうかに応じてどのように変化するかの詳細は、「特定のSubjectとしてアクションを実行するdoAsメソッド」を参照してください。

セキュリティ・マネージャは削除予定の非推奨であるため、コード内でメソッドSubject::getSubjectおよびSubject::doAsをそれぞれSubject::currentおよびSubject::callAsに置き換えることを強くお薦めします。特定のSubjectとしてアクションを実行するためのcallAsおよび現在のメソッドを参照してください。

ノート:

Subject::doAsPrivilegedメソッドには置換APIはありません。

Subject::getSubjectメソッドは、指定されたAccessControlContextに関連付けられたSubjectを返します。ただし、AccessControlContextクラスは削除予定の非推奨となりました。

セキュリティ・マネージャの削除時にこのコードが機能しなくなるため、AccessControlContextSubjectを格納するコードを移行し、できるだけ早くそのコンテキストでAccessController.doPrivilegedを起動する必要があります。

セキュリティ・マネージャが許可されている場合、AccessControlContextクラスはSubject::getSubjectと連動して、子スレッドから親スレッドの現在のSubjectにアクセスできるようにします。セキュリティ・マネージャが許可されていない場合、コードは、構造化並行性を持つSubject::currentメソッドを使用して、子スレッドから親スレッドの現在のSubjectにアクセスできます。詳細は、『Java Platform, Standard Editionコア・ライブラリ』「構造化並行性」および「特定のSubjectとしてアクションを実行するためのcallAsおよび現在のメソッド」を参照してください。

コード内の子スレッドがAccessControlContextクラスを介して親スレッドのSubjectにアクセスするかどうかを確認します。その場合は、親スレッドが新しく作成されたスレッドにSubjectを渡すか、構造化並行性を使用するようにコードを変更します。