Могу ли я обеспечить видимость, используя java.security?
Это вытекает из этого вопроса... который касается Groovy (= надмножество / модернизация Java), где, по-видимому, по существу нет скрытия информации и никакой инкапсуляции.
Но в Java, конечно же, есть отражение, а это означает, что private
, protected
и частный пакет по сути бессмыслен или хуже: создает ложное чувство безопасности.
В Java есть какой-либо способ обеспечения видимости, какой-то, не обязательно в смысле особого применения вышеуказанных модификаторов видимости, и частный пакет, используя SecurityManager
? Я только начал изучать последнее, и я не вижу никакого очевидного способа сделать что-то подобное. Но может показаться, что некоторые разработчики должны отправлять код там, где некоторые классы и методы не имеют полностью публичной видимости... так как это делается?
PS в пакете Lucene, с которым я немного знаком, замечаю, что довольно много классов оказывается final
(что иногда вызывало у меня головокружение...), но я почти уверен, хотя и не уверен, что это отражение можно использовать для подавления этого модификатора.
Downvotes
Ах, нет: вы должны быть любезны, чтобы сказать, почему в таком случае. Это не глупый вопрос, и теперь ваш отрицательный голос подсказывает, что вы не понимаете проблему.
1 ответ
Могу ли я написать свои классы, чтобы установить setAccessible-proof независимо от конфигурации SecurityManager? ... Или я во власти того, кто управляет конфигурацией?
Вы не можете, и вы, безусловно, есть. Любой, кто имеет доступ к вашему коду, может настроить JVM и SecurityManager по своему усмотрению. (более подробная информация ниже)
Является ли setAcessible законным? Почему это существует?
Базовые классы Java используют его как простой способ доступа к вещам, которые должны оставаться закрытыми по соображениям безопасности. Например, инфраструктура Java Serialization использует ее для вызова конструкторов частных объектов при десериализации объектов. Кто-то упомянул System.setErr, и это был бы хороший пример, но любопытно, что все методы класса System setOut / setErr / setIn используют собственный код для установки значения конечного поля.
Другое очевидное законное использование - это фреймворки (персистентность, веб-фреймворки, внедрение), которые должны заглянуть внутрь объектов.
И наконец...
Модификаторы доступа Java не предназначены для обеспечения безопасности.
Так что я могу сделать на самом деле?
Вы должны глубже изучить раздел " Поставщики безопасности" документации по безопасности Java SE:
Приложения не должны реализовывать безопасность самостоятельно. Скорее, они могут запрашивать услуги безопасности у платформы Java. Услуги безопасности реализованы в провайдерах
Архитектура управления доступом на платформе Java защищает доступ к конфиденциальным ресурсам (например, локальным файлам) или к чувствительному коду приложения (например, к методам в классе). Все решения по контролю доступа принимаются менеджером безопасности, представленным java.lang.SecurityManager
учебный класс. SecurityManager должен быть установлен во время выполнения Java, чтобы активировать проверки контроля доступа.
Апплеты Java и приложения Java ™ Web Start автоматически запускаются с установленным SecurityManager. Тем не менее, локальные приложения выполняются через java
команда по умолчанию не запускается с установленным SecurityManager. Для запуска локальных приложений с помощью SecurityManager либо само приложение должно программно установить его через setSecurityManager
метод (в java.lang.System
класс), или Java должен быть вызван с -Djava.security.manager
аргумент в командной строке.
Я рекомендую вам прочитать об этом в официальной документации по безопасности.
https://docs.oracle.com/javase/7/docs/technotes/guides/security/overview/jsoverview.html