2016-04-22 11 views
1

Независимо от того, используется ли я Oracle JDK, IBM JDK или Open JDK (все версии 8), я заметил, что следующий метод всегда возвращается null, когда класс идет речь, является JDK библиотека классов:Где я могу найти спецификацию метода Class.getProtectionDomain(). GetCodeSource()?

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

Что я хотел бы знать, так это то, является ли факт, что это null для набора классов (а именно классов, предоставленных JDK), где-то указано (в отличие от того, что оно является общепринятым значением для эти классы, определенные различными исполнителями).

Однако я не могу найти, где это будет указано. Я уже проверил следующие источники и не нашел ни одного упоминания там:

  • В Java SE 8 JLS
  • Java-SE 8 JVM Spec
  • JSR-115 (JavaTM Authorization контракт на контейнеры 1.5)

Где указано это поведение? Или это действительно не указано и «счастливое совпадение», что все три реализации JVM имеют одинаковое поведение?

(Бонусные баллы, если вы можете объяснить, как это неявно указано в результате других спецификаций, которые я подозреваю, дело!)

ответ

1

домена защиты является лицом, которое отражает то, что данный класс был загружен из конкретных источник с конкретными разрешениями и цепочками ключей, поэтому на самом деле каждый домен защиты всегда связан с загрузчиком классов, который загружает данный класс.

Загрузочный загрузчик (системный) classloader не имеет доменов, потому что его классы не были загружены из стороннего источника (они принадлежат самой системе), поэтому используется домен по умолчанию со всеми разрешениями, у которого нет CodeSource (поскольку системные классы не имеют определенного места в кодовой базе или подписывающих лиц, поэтому такая вещь не имеет смысла) и имеет все разрешения.

Отвечая на ваш первоначальный вопрос, Java Security не является частью спецификации Java Language (возможно, по историческим причинам, возможно, чтобы избежать перегрузки JLS с деталями). Сама спецификация безопасности - here, со всеми объяснениями поведения классов безопасности.

Наиболее полное описание API, связанного с безопасностью, можно найти here и here.

+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 только там. Идея заключается в том, что спецификация не охватывает все возможные методы, но понятия. Таким образом, частью домена, который отвечает за источник, который загружается загрузчиком классов, является CodeSource: url + keychains. CodeSource может быть нулевым, когда оба они отсутствуют, это именно то, что происходит для системных классов – qwwdfsad