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

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

你可以访问任何类的私有变量,但这是一个坏主意,因为你破坏了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来获取私有变量。 你几乎可以从任何地方获得它的价值。 但请记住 – 通常这是一种不好的做法。

你不能。 私有的全部意义在于你无法获得变量。 如果class级没有给出任何解决方法,你就无法得到它。 这可能是也可能不是课堂上的设计缺陷,但除非你使用具有适当特权的反思(我推荐 – 你基本上依赖于私人实施细节),你将不得不考虑另一种选择做法。

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

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


在同一主题上:

  • reflection是否打破了私有方法的想法,因为私有方法可以在类之外访问?
  • 通过reflection访问Java中的私有变量
  • Java中是否可以通过reflection访问私有字段

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

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