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

标签 java reflection jvm authorization jls

无论我使用 Oracle JDK、IBM JDK 还是 Open JDK(所有版本 8),我注意到当相关类是 a 时,以下方法始终返回 null JDK库类:

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

我想知道的是,对于一组类(即 JDK 提供的类),this 为 null 的事实是否在某处指定(而不是作为一个普遍商定的值)这些类,由各个实现者决定)。

但是,我似乎找不到在哪里指定它。我已经检查了以下来源,但没有发现其中有任何提及:

  • Java SE 8 JLS
  • Java SE 8 JVM 规范
  • JSR-115(JavaTM 容器授权契约(Contract) 1.5)

此行为在哪里指定?或者确实没有指定,并且所有三个 JVM 实现都具有相同的行为,这是一个“巧合”?

(如果你能解释这是如何作为其他规范的结果隐式指定的,我怀疑是这种情况,那就加分了!)

最佳答案

保护域是一个实体,反射(reflect)给定的类是从具有特定权限和钥匙串(keychain)的特定源加载的,因此实际上每个保护域始终与加载给定类的类加载器相关联。

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

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

可以找到最全面的安全相关 API 描述 herehere .

关于java - 在哪里可以找到 Class.getProtectionDomain().getCodeSource() 方法的规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36791107/

相关文章:

java JLayeredPane 如何在 Window builder 生成的另一个面板前面添加 JPanel

java - 使用字符串属性覆盖 hashCode 函数

java - 如何创建自定义 Android 单选按钮?

java - 使用多部分时无法提取表单字段数据——Java、GWT

c# - GetRuntimeProperties 而不是 GetProperty

c# - 如何反射(reflect) T 以构建查询的表达式树?

c# - 有没有办法确定泛型类型是否是从特定的泛型类型定义构建的?

java - Java 中的泛型 - 与遗留代码互操作

java - Class.forName 导致类加载器移至终身代?

performance - clojure "official"并发示例的可能改进(使用锁、原子、stm)