2010-08-30 13 views
9

Ho esteso una classe in Java che ha una variabile privata a cui voglio ottenere il valore prima che venga modificata. Non ci sono metodi per accedere a questa variabile nella super classe. Ho provato super().m_zoomArea (la variabile è nella classe ZoomableChart di jChart2D). La variabile viene aggiornata quando viene chiamato il metodo mouseDragged. Ho sovrascritto questo metodo e vorrei ottenere il valore della variabile prima che venga aggiornato.Accesso a una variabile privata della classe super() in Java - JChart2D

risposta

15

Non è possibile. Il fatto che sia privato è che non è possibile ottenere la variabile. Se la classe non ha dato modo di scoprirlo, non puoi ottenerlo. Questo può o non può essere un difetto di progettazione nella classe, ma a meno che non si usi la riflessione con i privilegi appropriati (che non sono non raccomandare - si basa fondamentalmente su dettagli di implementazione privati) si dovrà pensare un approccio alternativo.

2

Non è possibile accedere a variabili private dall'esterno della classe. Per accedervi dovresti averlo protetto.

4

È possibile utilizzare il riflesso ma è una cattiva idea. Un campo privato è privato perché lo sviluppatore non vuole farti scherzare.

Non ti darò il modo di farlo qui, ma se sei il davvero sai cosa fai, segui i link qui sotto a tuo rischio e pericolo. Ancora una volta, non dovresti nemmeno pensare a farlo.


Sullo stesso argomento:

0

Si può fare questo con l'API Reflection (In particolare, vedere la setAccessible () metodo). Comunque, questo è un hack e potrebbe non funzionare se c'è un SecurityManager installato nella VM.

25

È possibile accedere a variabili private di qualsiasi classe, ma è una cattiva idea, perché si sta infrangendo uno dei principi di base di OOP - l'incapsulamento.

Ma a volte il programmatore è costretto a romperlo. Ecco il codice, che risolve il problema:

classe estesa

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

} 

}

e chiamare esempio:

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

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

Non è necessario estendere ZoomableChart per ottenere privato variabile. Puoi ottenerlo quasi ovunque. Ma ricorda: di solito è una cattiva pratica.

Problemi correlati