Доступ к закрытой переменной класса super () в Java - JChart2D - PullRequest
10 голосов
/ 30 августа 2010

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

Ответы [ 5 ]

26 голосов
/ 30 августа 2010

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

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

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

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

15 голосов
/ 30 августа 2010

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

5 голосов
/ 30 августа 2010

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

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


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

2 голосов
/ 30 августа 2010

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

0 голосов
/ 30 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...