Я расширил класс в Java, в котором есть частная переменная, значение которой я хочу получить до ее изменения. В суперклассе нет методов доступа к этой переменной. Я пробовал super (). M_zoomArea
(переменная находится в классе ZoomableChart
jChart2D). Переменная обновляется при вызове метода mouseDragged
. Я переопределил этот метод и хотел бы получить значение переменной до его обновления.
Вы можете получить доступ к приватной переменной любого класса, но это плохая идея, потому что вы нарушаете один из основных принципов ООП - инкапсуляцию.
Но иногда программисты вынуждены ломать его. Вот код, который решает вашу проблему:
Расширенный класс
public class ExtZoomableChart
extends ZoomableChart {
public Rectangle2D getZoomArea() {
try {
Field field = ZoomableChart.class.getDeclaredField("m_zoomArea");
field.setAccessible(true);
Object value = field.get(this);
field.setAccessible(false);
if (value == null) {
return null;
} else if (Rectangle2D.class.isAssignableFrom(value.getClass())) {
return (Rectangle2D) value;
}
throw new RuntimeException("Wrong value");
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
и пример вызова:
public class Main {
public static void main(String[] args) {
ExtZoomableChart extZoomableChart = new ExtZoomableChart();
Rectangle2D d = extZoomableChart.getZoomArea();
System.out.println(d);
}
}
Вам не нужно расширять ZoomableChart, чтобы получить приватную переменную. Вы можете получить это значение почти отовсюду. Но помните - обычно это плохая практика.
Вы не можете. Весь смысл private в том, что вы не можете получить доступ к переменной. Если класс не дал никакого способа выяснить это, вы не можете получить это. Это может быть или не быть недостатком дизайна в классе, но если вы не используете отражение с соответствующими привилегиями (что я не рекомендую — вы в основном полагаетесь на частные детали реализации), вы собираетесь надо думать об альтернативном подходе.
Можно использовать отражение, но это плохая идея. Частное поле является частным, потому что разработчик не хочет, чтобы вы с ним связывались.
Я не буду рассказывать вам, как это сделать, но если вы действительно знаете, что делаете, переходите по ссылкам ниже на свой страх и риск. Опять же, вы не должны даже думать об этом.
По той же теме:
Вы не можете получить доступ к закрытым переменным вне класса. Чтобы получить к нему доступ, он должен быть защищен.
Это можно сделать с помощью Reflection API (в частности, см. метод setAccessible()). В любом случае, это хак и может не сработать, если на виртуальной машине установлен SecurityManager.