Почему позволяется получить доступ к Java частные поля через отражение?

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

43
задан Joachim Sauer 2 July 2013 в 15:28
поделиться

7 ответов

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

58
ответ дан 26 November 2019 в 22:38
поделиться

Оба getDeclaredField () и setAccessible () на самом деле проверяются менеджером безопасности и генерируют исключение, если ваш код не позволяет делать этот. Чаще всего вы этого не замечаете, потому что код Java часто запускается без диспетчера безопасности.

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

22
ответ дан 26 November 2019 в 22:38
поделиться

Отражение опасно. Период.

Какой смысл ограничивать полезность действительно опасной системы ради хоть сколько-нибудь повышенной безопасности?

Кроме того, автоматическая сериализация требует способности «высасывать мозги» из любого класса; в этом случае необходимо игнорировать модификаторы доступа.

8
ответ дан 26 November 2019 в 22:38
поделиться

Reflection - это полный API для проникновения внутрь классов. Частные члены и прочее.

В случаях, когда вы не доверяете выполняемому коду (апплеты и т.п.), вы можете вообще запретить коду использовать отражение. См. этот вопрос о переполнении стека для подробностей.

4
ответ дан 26 November 2019 в 22:38
поделиться

Из описания пакета java.lang.reflect :

Классы в этом пакете вместе с java.lang.Class для размещения такие приложения, как отладчики, интерпретаторы, инспекторы объектов, класс браузеры и службы, такие как Object Сериализация и JavaBeans, которым необходимы доступ к публичным членам целевой объект (в зависимости от времени его выполнения class) или члены, объявленные данный класс.

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

Да, отражение в целом действительно может быть опасным, так как оно может раскрыть внутреннюю часть классов и объектов.

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

3
ответ дан 26 November 2019 в 22:38
поделиться

От: http://java.sun.com/docs/books/tutorial/reflect/

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

Это инструмент, который позволяет нарушить некоторые правила, можно перебросить его через ногу или использовать должным образом.

3
ответ дан 26 November 2019 в 22:38
поделиться

Сокращения ложатся гораздо большей нагрузкой на читателя. Они неоднозначны; они косвенные; их труднее различить. Они обременяют и писателя, потому что он / она всегда должны спрашивать: «Это Cmd для Command, или Cmnd ... или Cm?». Они противоречат друг другу - данное правило сокращения может дать одно и то же сокращение для двух (или более) разных слов.

Поскольку они неоднозначны, читатель должен подумать, какое слово имеет в виду; если присутствует само слово, читателю нужно только подумать о его значении.

Поскольку они косвенные, они аналогичны указателю - точно так же, как на каждое разыменование указателя требуется небольшое время обработки, такие как Java Object Serialization или другие механизмы сохранения, для управления объектами способом, который обычно был бы запрещен.

Я полагаю, что эту функцию можно отключить с помощью SecurityManager

http://javabeans.asia/2008/10/12/how_to_set_securitymanager_and_java_security_policy_programmatically.html

10
ответ дан 26 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: