我在哪里可以找到Class.getProtectionDomain()。getCodeSource()方法的规范?

时间:2016-04-22 10:19:33

标签: java reflection jvm authorization jls

无论我使用的是Oracle JDK,IBM JDK还是Open JDK(所有版本8),我都注意到当有问题的类是JDK时,以下方法总是返回null图书馆类:

    Class clazz = Integer.class;
    CodeSource codeSource = clazz.getProtectionDomain().getCodeSource(); 

我想知道的是,对于一组类(即JDK提供的类),这是否为null的事实是在某处指定的(而不是它是一个共同商定的值)这些课程由各个实施者决定)。

但是,我似乎无法找到指定的位置。我已经检查了以下来源,但没有在那里找到任何提及:

  • Java SE 8 JLS
  • Java SE 8 JVM Spec
  • JSR-115(容器1.5的JavaTM授权合同)

指定此行为的位置?或者它确实没有被指定,并且是一个快乐的巧合"所有三个JVM实现都具有相同的行为?

(如果你可以解释这是如何由于其他规范而隐含指定的,那么我会怀疑是这样的!)

1 个答案:

答案 0 :(得分:1)

保护域是一个实体,它反映给定的类是从具有特定权限和密钥链的特定源加载的,因此实际上每个保护域始终与加载给定类的类加载器相关联。

Bootstrap(系统)类加载器没有任何域,因为它的类没有从第三方源加载(它们属于系统本身),所以使用了具有所有权限的默认域,它没有CodeSource(因为系统类没有特定的代码库位置或签名者,所以这样的事情毫无意义)并拥有所有权限。

回答您的原始问题,Java安全性不是Java语言规范的一部分(可能出于历史原因,可能是为了避免JLS重载的细节)。 安全规范本身是here,所有安全类行为都是解释。

可以找到最全面的与安全相关的API说明herehere