我在Java中扩展了一个类,它有一个私有变量,我希望在变量之前得到它的值.没有方法可以在超类中访问此变量.我试过super().m_zoomArea(变量在ZoomableChartjChart2D 的类中).mouseDragged调用方法时更新变量.我已重写此方法,并希望在更新之前获取变量的值.
Vad*_*deg 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);
}
}
Run Code Online (Sandbox Code Playgroud)
}
并调用示例:
public class Main {
public static void main(String[] args) {
ExtZoomableChart extZoomableChart = new ExtZoomableChart();
Rectangle2D d = extZoomableChart.getZoomArea();
System.out.println(d);
}
}
Run Code Online (Sandbox Code Playgroud)
您不需要扩展ZoomableChart来获取私有变量.你几乎可以从任何地方获得它的价值.但请记住 - 通常这是一种不好的做法.
Jon*_*eet 15
你不能.私有的全部意义在于你无法获得变量.如果班级没有给出任何解决方法,你就无法得到它.这可能是也可能不是课堂上的设计缺陷,但除非你使用具有适当特权的反思(我不推荐 - 你基本上依赖于私人实施细节),你将不得不考虑另一种选择做法.
你可以使用反射,但这是一个坏主意.私有字段是私有的,因为开发人员不希望您搞砸它.
我不会在这里给你这样做的方法,但如果你真的知道你做了什么,请按照以下链接自担风险.再说一遍,你甚至不应该考虑这样做.
在同一主题上: