2010-08-30 3 views
9

Ich habe eine Klasse in Java erweitert, die eine private Variable hat, von der ich den Wert erhalten möchte, bevor sie geändert wird. Es gibt keine Methoden, um auf diese Variable in der Superklasse zuzugreifen. Ich habe versucht super().m_zoomArea (die Variable ist in der ZoomableChart Klasse von jChart2D). Die Variable wird aktualisiert, wenn die Methode mouseDragged aufgerufen wird. Ich habe diese Methode überschrieben und möchte den Wert der Variablen abrufen, bevor sie aktualisiert wird.Zugriff auf eine private Variable der Klasse super() in Java - JChart2D

Antwort

15

Sie können nicht. Der springende Punkt ist private ist, dass Sie nicht auf die Variable bekommen können. Wenn die Klasse keine Möglichkeit gefunden hat, es herauszufinden, können Sie es nicht bekommen. Das kann oder kann nicht ein Designfehler in der Klasse sein, aber wenn Sie Reflektionen mit geeigneten Rechten verwenden (die ich nicht empfehle - Sie verlassen sich im Grunde auf private Implementierungsdetails), müssen Sie daran denken ein alternativer Ansatz.

2

Sie können nicht auf private Variablen außerhalb der Klasse zugreifen. Um darauf zugreifen zu können, müsstest du es geschützt haben.

4

Sie könnten Reflexion verwenden, aber es ist eine schlechte Idee. Ein privates Feld ist privat, weil der Entwickler nicht möchte, dass Sie sich damit anlegen.

Ich gebe Ihnen nicht den Weg, es hier zu tun, aber wenn Sie wirklich wissen, was Sie tun, folgen Sie den unten stehenden Links auf eigene Gefahr. Auch hier solltest du nicht einmal darüber nachdenken.


zum gleichen Thema:

0

Sie können dies mit dem Reflection-API (genauer gesagt, finden Sie in der setAccessible () Methode). Wie auch immer, dies ist ein Hack und funktioniert möglicherweise nicht, wenn ein SecurityManager in der VM installiert ist.

25

Sie können auf private Variable jeder Klasse zugreifen, aber es ist eine schlechte Idee, weil Sie eines der grundlegenden Prinzipien der OOP - Kapselung brechen.

Aber manchmal Programmierer sind gezwungen, es zu brechen. Hier ist der Code, der das Problem löst:

Erweiterte Klasse

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

} 

}

und rufen Beispiel:

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

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

Sie brauchen nicht ZoomableChart zu erweitern privat zu bekommen Variable. Sie können es fast von überall her erhalten. Aber denken Sie daran - normalerweise ist es eine schlechte Übung.

Verwandte Themen