НУЖНО ЛИ БЫТЬ ОБ ЭТОМ БЕСПОКОЙСТВОМ ???
Это полностью зависит от того, какие программы вы пишете и для какой архитектуры.
Если вы распространяете программный компонент под названием foo.jar среди людей всего мира, вы в любом случае полностью зависите от него. Они могут изменить определения классов внутри вашего .jar (путем обратного инжиниринга или прямого манипулирования байт-кодом). Они могут запускать ваш код в своей собственной JVM и т. Д. В этом случае беспокойство не принесет вам пользы.
Если вы пишете веб-приложение, которое взаимодействует только с людьми и системами через HTTP, и вы управляете сервером приложений, это тоже не проблема. Конечно, коллеги-программисты в вашей компании могут создавать код, который нарушает ваш шаблон синглтона, но только если они действительно этого хотят.
Если ваша будущая работа - написание кода в Sun Microsystems / Oracle, и вам поручено написание кода для ядра Java или других доверенных компонентов, это то, о чем вы должны знать. Беспокойство, однако, просто заставит вас потерять свои волосы. В любом случае они, вероятно, заставят вас прочитать Руководство по безопасному кодированию вместе с внутренней документацией.
Если вы собираетесь писать Java-апплеты, вам следует знать о структуре безопасности. Вы обнаружите, что неподписанные апплеты, пытающиеся вызвать setAccessible, просто приведут к исключению SecurityException.
setAccessible - не единственное, что обходится при обычных проверках целостности. Существует не-API, базовый Java-класс под названием sun.misc.Unsafe, который может делать практически все, что захочет, включая прямой доступ к памяти. Нативный код (JNI) также может обойти этот тип управления.
В изолированной среде (например, Java Applets, JavaFX) каждый класс имеет набор разрешений и доступ к Unsafe, setAccessible и определения собственных реализаций, контролируемых SecurityManager.
«Модификаторы доступа Java не предназначены для обеспечения безопасности».
Это очень сильно зависит от того, где выполняется Java-код. Базовые классы Java используют модификаторы доступа в качестве механизма безопасности для обеспечения безопасности песочницы.
Каково действительно законное использование для setAccessible?
Базовые классы Java используют его как простой способ доступа к вещам, которые должны оставаться закрытыми по соображениям безопасности. Например, инфраструктура Java Serialization использует ее для вызова конструкторов частных объектов при десериализации объектов. Кто-то упомянул System.setErr, и это было бы хорошим примером, но любопытно, что все методы класса System setOut / setErr / setIn все используют собственный код для установки значения конечного поля.
Другим очевидным законным использованием являются фреймворки (персистентность, веб-фреймворки, внедрение), которые должны заглянуть внутрь объектов.
Отладчики, на мой взгляд, не попадают в эту категорию, поскольку они обычно не работают в одном и том же процессе JVM, а вместо этого взаимодействуют с JVM с использованием других средств (JPDA).
Может ли Java быть спроектирован так, чтобы НЕ иметь такую потребность?
Это довольно глубокий вопрос, на который нужно ответить хорошо. Я думаю, что да, но вам нужно добавить какой-то другой механизм (механизмы), который может быть не столь предпочтительным.
Можно ли ограничить setAccessible только для законного использования?
Самое прямое ограничение OOTB, которое вы можете применить, - это иметь SecurityManager и разрешать setAccessible только для кода, поступающего из определенных источников. Это то, что Java уже делает - стандартным Java-классам, которые приходят из вашего JAVA_HOME, разрешено делать setAccessible, в то время как неподписанным классам апплетов из foo.com не разрешается делать setAccessible. Как было сказано ранее, это разрешение является двоичным, в том смысле, что оно есть или нет. Не существует очевидного способа разрешить setAccessible изменять определенные поля / методы, в то же время запрещая другие. Используя SecurityManager, вы можете запретить классам ссылаться на определенные пакеты полностью, с отражением или без него.
Могу ли я написать свои классы, чтобы установить setAccessible-proof независимо от конфигурации SecurityManager? ... Или я во власти того, кто управляет конфигурацией?
Вы не можете, и вы, безусловно, есть.