Изменение поля в Java
Рефлексия позволяет менять поле там, где обычный код
не имеет доступа. Пара setAccessible и
set работает и для закрытых полей, но такой
приём стоит применять осознанно: он обходит правила
инкапсуляции.
Метод set принимает экземпляр и новое значение.
Для открытого поля:
import java.lang.reflect.Field;
class Gauge {
public int level = 1;
}
public class Main {
public static void main(String[] args) throws Exception {
Gauge unit = new Gauge();
Field levelField = Gauge.class.getField("level");
levelField.set(unit, 5);
System.out.println(unit.level);
}
}
Закрытое поле меняют так же, но сначала открывают
доступ и берут поле через getDeclaredField:
import java.lang.reflect.Field;
class Gauge {
private int level = 1;
int level() {
return level;
}
}
public class Main {
public static void main(String[] args) throws Exception {
Gauge unit = new Gauge();
Field levelField = Gauge.class.getDeclaredField("level");
levelField.setAccessible(true);
levelField.set(unit, 5);
System.out.println(unit.level());
}
}
Тип нового значения должен подходить полю. Для
примитивов передают соответствующий объект-обёртку
или значение, которое автоматически упакуется при
вызове set.
Класс Slot содержит закрытое поле
code типа String. Установите
ему значение "beta" средствами рефлексии
и выведите результат через публичный метод
доступа, если он есть, или снова.