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
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.
Non è possibile accedere a variabili private dall'esterno della classe. Per accedervi dovresti averlo protetto.
È 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:
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.
È 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.
- 1. accesso alla variabile all'interno della classe interna in java
- 2. accesso a una variabile da un'altra classe
- 3. javascript accesso funzione privata variabile pubblica
- 4. Classi nidificate locali Java e accesso a super metodi
- 5. Accesso a una variabile membro protetta all'esterno di una classe
- 6. Accesso non inizializzata variabile privata atomica in C++
- 7. accesso variabile privata dalla funzione membro in PHP
- 8. Possiamo accedere a una variabile privata in un'altra classe a macchina
- 9. Accesso variabile globale dall'interno di una classe
- 10. "override" membro super classe in sottoclasse java
- 11. Accesso a un metodo in una super classe quando non è esposto
- 12. C++ Lambda cattura membro della classe privata
- 13. Rendi XStream ignora una variabile privata specifica
- 14. Modificatori di accesso all'interno di una classe nidificata statica privata in Java
- 15. Accesso Java alla proprietà privata tramite Reflection
- 16. Variabile membro membro della classe derivata accesso in funzione virtuale
- 17. Come in Dart creare una variabile privata?
- 18. Accesso Java valore della variabile statica finale attraverso la riflessione
- 19. Dove è una variabile di istanza privata di una classe astratta creata nell'heap?
- 20. Accesso a Config.groovy dalla classe Java
- 21. Chiama il metodo della classe privata dal metodo dell'istanza privata
- 22. Accesso alla funzione di super classe utilizzando l'oggetto sottoclasse
- 23. Posso trasmettere una classe derivata a una classe base privata, usando il cast in stile C?
- 24. Accesso alla variabile statica dall'oggetto in Java
- 25. Accesso alla classe nidificata privata restituita dalla funzione membro
- 26. creare un oggetto prima della chiamata di super in java
- 27. Accesso ai campi privati della superclasse usando la parola chiave super in una sottoclasse
- 28. variabili di accesso della classe esterna in Java
- 29. Assegnare una sottoclasse di una classe generica a una classe super-di questa classe
- 30. Perché una classe super può essere inizializzata come classe figlio in Java?