我在Java中扩展了一个类,其中有一个私有变量,在其改变之前想要获取其值。在父类中没有访问该变量的方法。我尝试使用super().m_zoomArea
(该变量位于jChart2D的ZoomableChart
类中)。该变量在调用mouseDragged
方法时更新。我已经重写了此方法,并希望在更新之前获取该变量的值。
我在Java中扩展了一个类,其中有一个私有变量,在其改变之前想要获取其值。在父类中没有访问该变量的方法。我尝试使用super().m_zoomArea
(该变量位于jChart2D的ZoomableChart
类中)。该变量在调用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类型的变量,意味着你无法访问它。如果这个类没有提供任何方法来获取它的值,那么你就无法得到它。这可能是这个类的一个设计缺陷,但除非你使用适当权限的反射(我不建议这样做,因为你基本上依赖于私有实现细节),否则你必须考虑其他的方法。
同一主题: