NamerPRO
@NamerPRO
Since June 2019

Смысл сокрытия, когда есть рефлексия?

Недавно прочитал статью по рефлексии. И возник вопрос:
Зачем нужно сокрытие через модификаторы доступа и геттеры и сеттеры, если все это легко так обходится через рефлексию?
Приведу пример.
Вот есть класс A:
public class A
{

private int age = 0;

public void setAge(int age)
{
if((age > 0) & (age < 100)) this.age = age;
}

public int getAge()
{
return this.age;
}

}

Смысл сокрытия, если я могу через рефлексию создать объект с возрастом 1000 лет и сломать программу:
public class B
{

public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
{
A myClass = new A();
Field field = myClass.getClass().getDeclaredField("age");
field.setAccessible(true);
field.set(myClass, 1000);
field.setAccessible(!field.isAccessible());
System.out.println(myClass.getAge());
}

}

Выведет 1000. И в чем смысл такой защиты? Что нам дает такой setter и такой модификатор доступа? Private поля не наследуются разве что только.
Задавал вопрос на javarush в качестве комментария автору статьи о рефлексии, но он походу уже давно не заходил на сайт.
Пожалуйста, максимально просто. Я еще совсем новичок.
Заранее спасибо :)
  • Вопрос задан
  • 1313 просмотров
Решения вопроса 3
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Сокрытие в целом и модификаторы доступа в частности - это не про защиту от злонамеренных хакеров, взламывающих ваш код. Модификаторы доступа нужны для предотвращения непреднамеренно ошибочного использования объектов. В больших системах бывает сложно уследить, что один объект из сотен, в одном из тысяч возможных состояний программы не нарушает инварианты другого объекта. Весь ООП нужен для снижения сложности кода.

А рефлексия - это чёрных ход в JVM. Рефлексивный код медленный и небезопасный. Он наоборот увеличивает сложность и сводит к нулю половину достоинств языка. Применять рефлексию допустимо только при разработке инструментальных средств и фреймворков. И даже при этом стоит стремиться сократить обращение к ней.

Образно говоря, вам необязательно пить и есть, питаться вы можете и через капельницу. Но это не значит, что вам не нужны зубы и 5 метров кишечника.
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Затем, что модификаторами доступа ты описываешь интерфейс (в смысле API) класса. То, что можно дёргать снаружи, публичное. То, что могут дергать наследники - протектед. То, что никто не должен знать - приватное. Если кто-то лезет в приватные поля рефлексией - ССЗБ, ты на это закладываться не должен, и поведение не гарантируешь.
Ты имеешь право в любой момент менять реализацию и поведение приватных полей и методов. Публичный интерфейс должен сохраняться.
Короче, это всё как декларация намерений.
Ответ написан
RiseOfDeath
@RiseOfDeath
Диванный эксперт.
age > 0

А вы в курсе что возраст детей, в первый год жизни, меньше одного года?

age < 100

И, к стати, люди, иногда (хоть и редко), живут больше 99 лет.

По сабжу давайте я приведу понятный пример с автомобилем.

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

Ответ:
Удобно, вы точно знаете как оно работает, производитель может поменять начинку (например заменить всякую механику и пневматику компьютером и электроприводами), а педалей как было три (или две) так и осталось, их функционал не изменился. Более того, в аналогичных изделиях другого производителя внезапно тот же API -педали и спидометр, хотя под капотом вообще может оказаться электромобиль.

В общем логика такова:
"Вот вам функции, за них и дергайте... а если лезете под капот... вы знаете что делаете и/или ССЗБ, а у нас лапки.

Пожалуйста, максимально просто. Я еще совсем новичок.

В любом случае - если вы не знаете (и/или не можете объяснить хотя бы резиновой уточке) зачем вам нужна рефлексия - она вам 100% не нужна.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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