Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
grant {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
package test;
public class A {
static {
if (System.getSecurityManager() == null)
System.setSecurityManager(new SecurityManager());
}
private int x = 33;
public void test() {
System.out.println(x);
}
}
package access;
import java.lang.reflect.Field;
import test.A;
public class X {
public void getAccess() throws Exception {
A a = new A();
Field x = a.getClass().getDeclaredField("x");
x.setAccessible(true);
x.setInt(a, x.getInt(a) + 1);
System.out.print("private field: ");
a.test();
}
public static void main(String[] str) throws Exception {
new X().getAccess();
}
}Инкапсуляция - это не сокрытие. Более того, что в некоторых языках сокрытия вообще нет, а инкапсуляция есть (это не мешает этим языкам быть ООП). Ещё в далёком 2002-м мне как сказали определение инкапсуляции, так и до сих пор только это для меня истина: "Инкапсуляция - это свойство объекта, позволяющее хранить как данные, так и методы работы с ними". То есть, инкапсуляция - поля и методы, объединенные в одном объекте и ничего более. О сокрытии ни слова
Сетовать на то, что инструмент де плох — так это уже проблема «плохого танцора»: вы с тем же успехом можете «выстрелить себе в ногу» и говорить, что пистолет вам дали плохой.
Как я заново открыл для себя инкапсуляцию в java.