2010-08-30 18 views
9

He extendido una clase en Java que tiene una variable privada de la que quiero obtener el valor antes de cambiarla. No hay métodos para acceder a esta variable en la superclase. He intentado super().m_zoomArea (la variable está en la clase ZoomableChart de jChart2D). La variable se actualiza cuando se llama al método mouseDragged. He reemplazado este método y me gustaría obtener el valor de la variable antes de que se actualice.Acceda a una variable privada de la clase super() en Java - JChart2D

Respuesta

15

No puede. El punto de que es privado es que no se puede obtener en la variable. Si la clase no ha dado ninguna forma de averiguarlo, no puede obtenerlo. Eso puede o no ser un defecto de diseño en la clase, pero a menos que use el reflejo con los privilegios adecuados (que I no recomienda, básicamente se basa en detalles de implementación privados) tendrá que pensar en un enfoque alternativo.

2

No puede acceder a las variables privadas desde fuera de la clase. Para acceder a él, debes tenerlo protegido.

4

Podría usar el reflejo, pero es una mala idea. Un campo privado es privado porque el desarrollador no quiere que te metas con él.

No le daré la manera de hacerlo aquí, pero si realmente sabe lo que hace, siga los enlaces a continuación bajo su responsabilidad. De nuevo, ni siquiera deberías pensar en hacer esto.


Sobre el mismo tema:

0

Usted puede hacer esto con el API de reflexión (en concreto, consulte la setAccessible () método). De todos modos, este es un truco y puede no funcionar si hay un SecurityManager instalado en la VM.

25

Puede acceder a la variable privada de cualquier clase, pero es una mala idea, ya que está rompiendo uno de los principios básicos de OOP - encapsulación.

Pero a veces los programadores se ven obligados a romperlo. Aquí está el código, que resuelve su problema:

clase extendida

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); 
    } 

} 

}

y llame ejemplo:

public class Main { 
    public static void main(String[] args) { 
     ExtZoomableChart extZoomableChart = new ExtZoomableChart(); 

     Rectangle2D d = extZoomableChart.getZoomArea(); 
     System.out.println(d); 
    } 
} 

No es necesario extender ZoomableChart para obtener privada variable. Puedes obtener su valor casi de todas partes. Pero recuerda: generalmente es una mala práctica.

Cuestiones relacionadas