2016-07-25 4 views
1

я прочитал следующую статью об отражении в Java:Может ли отражение изменения состояния объекта?

https://community.oracle.com/docs/DOC-983192

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

Я в то время назад прочитал книгу Джошуа Блока: «Эффективная Ява». Там он говорит, что для предотвращения небезопасного доступа к полям, методам и т. Д., Когда это возможно, мы должны давать поля и методы наиболее ограничительный модификатор (т. Е. Частный, когда это возможно, публичный или защищенный, если он является частью разоблаченный api).

Мой вопрос заключается в следующем:

Зачем проектирование классы, чтобы не подвергать разумной информации, если она может быть доступна через отражение в любом случае?

(На самом деле, я прошу кусок информации, что мне не хватает, чтобы понять эту тему)

+3

Маркировка поля, закрытого или защищенного, имеет большое значение, позволяя пользователям вашей библиотеки или API знать, как они должны использовать (или не использовать) это поле. Это не просто вопрос безопасности. – rmlan

+8

Сделать вещи приватными - это как надевать изолированную крышку на электрическую розетку: она указывает людям, как вы хотите их использовать; но это не мешает кому-то открутить переднюю часть и прикоснуться к живым проводам. –

+2

Также можно использовать SecurityManager для предотвращения отражения. См. Http://stackoverflow.com/questions/7566626/how-to-restrict-developers-to-use-reflection-to-access-private-methods-and-const – dnault

ответ

3

С одной стороны, «частный» не означает, как функция безопасности. См. this similar question. Java имеет систему безопасности, которую вы должны использовать, если вы действительно хотите такую ​​защиту.

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

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