访问Java中的super()类的私有变量--JChart2D

时间:2010-08-30 19:07:21

标签: java inheritance

我在Java中扩展了一个具有私有变量的类,我希望在变量之前得到它的值。没有方法可以在超类中访问此变量。我试过super().m_zoomArea(变量在jChart2D的ZoomableChart类中)。调用mouseDragged方法时更新变量。我已覆盖此方法,并希望在更新之前获取变量的值。

5 个答案:

答案 0 :(得分:26)

你可以访问任何类的私有变量,但这是一个坏主意,因为你破坏了OOP的一个基本原则 - 封装。

但有时程序员被迫打破它。这是代码,它可以解决您的问题:

扩展课程

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来获取私有变量。你几乎可以从任何地方获得它的价值。但请记住 - 通常这是一种不好的做法。

答案 1 :(得分:15)

你做不到。 私有的全部意义在于你无法获得变量。如果班级没有给出任何解决方法,你就无法得到它。这可能是也可能不是类中的设计缺陷,但除非你使用具有适当权限的反射(我推荐 - 你基本上依赖于私有实现细节)你要去必须考虑另一种方法。

答案 2 :(得分:5)

你可以使用反射,但这是一个坏主意。私有字段是私有的,因为开发人员不希望你搞砸它。

我不会在这里给你这样做的方法,但如果你真的知道你做了什么,请按照以下链接自担风险。再说一遍,你甚至不应该考虑这样做。


关于同一主题:

答案 3 :(得分:2)

您无法从班级外部访问私有变量。要访问它,您必须保护它。

答案 4 :(得分:0)

您可以使用Reflection API执行此操作(具体来说,请参阅setAccessible()方法)。无论如何,这是一个黑客攻击,如果在VM中安装了SecurityManager,则可能无法正常工作。