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

11

我在Java中扩展了一个类,其中有一个私有变量,在其改变之前想要获取其值。在父类中没有访问该变量的方法。我尝试使用super().m_zoomArea(该变量位于jChart2D的ZoomableChart类中)。该变量在调用mouseDragged方法时更新。我已经重写了此方法,并希望在更新之前获取该变量的值。

5个回答

27

您可以访问任何类的私有变量,但这是一个不好的主意,因为您正在破坏面向对象编程的基本原则之一 - 封装。

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

扩展类

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

你无法获取它。它被声明为private类型的变量,意味着你无法访问它。如果这个类没有提供任何方法来获取它的值,那么你就无法得到它。这可能是这个类的一个设计缺陷,但除非你使用适当权限的反射(我不建议这样做,因为你基本上依赖于私有实现细节),否则你必须考虑其他的方法。


4
你可以使用反射,但这是一个糟糕的想法。私有字段是私有的,因为开发人员不希望你随意更改它。
我不会在这里告诉你如何做,但如果你真的知道自己在做什么,请自行承担风险按以下链接操作。再次强调,你甚至不应该考虑这样做。

同一主题:


1
你无法从类外访问私有变量。为了访问它,你必须将其设置为受保护状态。

1
你可以使用反射API来实现这个(具体地,看setAccessible()方法)。无论如何,这是一种破解方式,如果虚拟机中安装了SecurityManager,则可能无法正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接