2016-04-22 16 views
1

かかわらず、私はOracleのJDK、IBM JDKまたはOpen JDK(すべてのバージョン8)を使用するかどうか、私は問題のクラスは、JDKライブラリクラスである場合は、次のメソッドは、常にnullを返していることに気づいの:Class.getProtectionDomain()。getCodeSource()メソッドの仕様はどこにありますか?

Class clazz = Integer.class; 
    CodeSource codeSource = clazz.getProtectionDomain().getCodeSource(); 
私が知りたいのですが、それはのための時に一般的に合意された値であることとは対照的に、これはクラスのセットのためにnullであるという事実は(つまり、クラスはJDKによって提供される)(どこかに指定されているか否かである

これらのクラスは、さまざまな実装者によって決定されます)。

しかし、これがどこで指定されるのかわかりません。私はすでに次のソースをチェックしましたし、そこに一切の言及を発見していない:

  • のJava SE 8 JLSは
  • のJava SE 8 JVMスペックは
  • JSR-115(コンテナ1.5用のJavaTM認証契約)この動作が指定されている

?または、実際には指定されておらず、3つのJVM実装の動作がすべて同じであるという「幸せな一致」ですか?

(ボーナスポイントあなたはこれが暗黙のうちに私がそうである疑いがあるその他の仕様、結果として指定されている方法を説明できるかどうか!)

答えて

1

保護ドメインは、与えられたクラスが特定からロードされたことを反映しているエンティティであります特定のアクセス権とキーチェーンを持つソースです。実際、すべての保護ドメインは、常に指定されたクラスをロードしたクラスローダーに関連付けられています。

ブートストラップ(システム)クラスローダーは、そのクラスが第三者ソースからロードされていない(システム自体に属している)ため、すべてのパーミッションを持つデフォルトドメインが使用され、特定のコードベースの場所や署名者がないので、意味がない)、すべての権限を持ちます。

あなたの元の質問に答える、Javaセキュリティは、Java言語仕様の一部ではない(多分歴史的な理由のために、多分JLSは細部に過負荷を避けるため)。 セキュリティ仕様自体はhereであり、すべてのセキュリティクラスの動作の説明があります。

最も包括的なセキュリティ関連のAPIの説明がherehereを見つけることができます。

+0

それが行動を説明するため、最大投票 - 。しかし、* *答えとしてマーキングではない、それは* *質問(「私は(Class.getProtectionDomainの仕様を見つけることができます)getCodeSource()メソッドに応答しないので、 ? ") – Marco

+0

それは残念ながらどこにも指定されていないように見えます..:/ – Marco

+0

@Marco http://docs.oracle.com/javase/8/docs/technotes/guides/security/spec/security-spec.doc4.html #a21491だけあります。アイデアは、specはすべての可能な方法をカバーするのではなく、概念をカバーしているということです。したがって、クラスローダーによってロードされたソースを担当するドメインの一部は、CodeSource:url + keychainsです。 CodeSourceは、どちらも存在しない場合はnullでもかまいません。システムクラスの場合はまさにそれが起こります。 – qwwdfsad

関連する問題