Доступ к частной переменной класса super () в Java - JChart2D

Я расширил класс в Java, в котором есть частная переменная, значение которой я хочу получить до ее изменения. В суперклассе нет методов доступа к этой переменной. Я пробовал super (). M_zoomArea (переменная находится в классе ZoomableChart jChart2D). Переменная обновляется при вызове метода mouseDragged . Я переопределил этот метод и хотел бы получить значение переменной до его обновления.

10
задан Michael Mrozek 30 August 2010 в 19:15
поделиться

5 ответов

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

Но иногда программисты вынуждены ломать его. Вот код, который решает вашу проблему:

Расширенный класс

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, чтобы получить приватную переменную. Вы можете получить это значение почти отовсюду. Но помните - обычно это плохая практика.

26
ответ дан 3 December 2019 в 13:27
поделиться

Вы не можете. Весь смысл private в том, что вы не можете получить доступ к переменной. Если класс не дал никакого способа выяснить это, вы не можете получить это. Это может быть или не быть недостатком дизайна в классе, но если вы не используете отражение с соответствующими привилегиями (что я не рекомендую — вы в основном полагаетесь на частные детали реализации), вы собираетесь надо думать об альтернативном подходе.

15
ответ дан 3 December 2019 в 13:27
поделиться

Можно использовать отражение, но это плохая идея. Частное поле является частным, потому что разработчик не хочет, чтобы вы с ним связывались.

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


По той же теме:

5
ответ дан 3 December 2019 в 13:27
поделиться

Вы не можете получить доступ к закрытым переменным вне класса. Чтобы получить к нему доступ, он должен быть защищен.

2
ответ дан 3 December 2019 в 13:27
поделиться

Это можно сделать с помощью Reflection API (в частности, см. метод setAccessible()). В любом случае, это хак и может не сработать, если на виртуальной машине установлен SecurityManager.

0
ответ дан 3 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

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