1

Method.setAccessible()の呼び出しが許可されている条件を理解しようとしています。ドキュメントのさまざまな部分を理解している限り、setAccessible()を呼び出すと、SecurityManagerでチェックがトリガーされ、アクセス修飾子の変更が許可されているかどうかが確認されます。

それを踏まえて、この権限のデフォルト設定が何であるか、そしてどこで変更できるかを調べようとしました。中央のjava.policyファイルでは、これらのアクセス許可については言及されておらず、有効な他のポリシーファイルも見つかりませんでした。また、SecurityManagerが適用する可能性のあるデフォルトに関する追加のドキュメントも見つかりませんでした。

私がこれを理解しようとしている主な理由は、アクセス修飾子を回避するためにリフレクションを使用していることです。そして、これをクライアントのために機能させる方法について、私のコードをクライアントに伝えなければならないことを知りたいです。

どこを見ればよいか、これがどのように機能するかについての洞察はありますか?

4

1 に答える 1

3

それはすべてSecurityManagerに関するものです。

デフォルトでは、SecurityManagerはインストールされていません(これが、すべての権限チェックがSMの可用性をチェックする理由です)。これがデフォルトです-すべてが正常です。

一部のランチャー(アプレット環境など)はSecurityManagerをインストールし、SecurityManagerはデフォルトでポリシーファイルベースのポリシーを使用します。これは「java.security」ファイルで変更できます。他の環境(サーブレットコンテナやJava EEコンテナなど)でもSecurityManagerがインストールされる場合があります。

この後、Javaセキュリティが導入されます。デフォルトでは、コードは「setAccessible」を呼び出すことができなくなります。

これを再度有効にするには、ポリシーファイルを変更する必要があります(デフォルトのポリシーがアクティブな場合、アクティブでない場合は->実行している環境のドキュメントを読んでください)。アクセサをアクセス可能にすることは大きな変更です。したがって、要件とランタイム環境の要件に互換性があるかどうかを再確認してください。たとえば、プレーンアプレットに対してこの変更を行うと、セキュリティが大幅に低下します。

grant  {
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};

権限を有効にします。

于 2012-05-05T08:03:57.000 に答える