2010-08-30 8 views
9

J'ai étendu une classe en Java qui a une variable privée dont je veux avoir la valeur avant de la changer. Il n'y a pas de méthodes pour accéder à cette variable dans la super classe. J'ai essayé super().m_zoomArea (la variable est dans la classe ZoomableChart de jChart2D). La variable est mise à jour lorsque la méthode mouseDragged est appelée. J'ai surchargé cette méthode et j'aimerais obtenir la valeur de la variable avant qu'elle ne soit mise à jour.Accéder à une variable privée de la classe super() en Java - JChart2D

Répondre

15

Vous ne pouvez pas. Tout le point de privé est que vous ne pouvez pas obtenir à la variable. Si la classe n'a donné aucun moyen de le découvrir, vous ne pouvez pas l'obtenir. Cela peut ou peut ne pas être un défaut de conception dans la classe, mais à moins que vous n'utilisiez la réflexion avec des privilèges appropriés (que je ne recommande pas - vous dépendez essentiellement de détails de mise en œuvre privés), vous devrez penser à une approche alternative.

2

Vous ne pouvez pas accéder à des variables privées en dehors de la classe. Pour y accéder, il faudrait que ce soit protégé.

4

Vous pourriez utiliser la réflexion mais c'est une mauvaise idée. Un champ privé est privé car le développeur ne veut pas que vous le manipuliez.

Je ne vous donnerai pas le moyen de le faire ici, mais si vous savez vraiment ce que vous faites, suivez les liens ci-dessous à vos risques et périls. Encore une fois, vous ne devriez même pas penser à faire cela.


Sur le même sujet:

0

Vous pouvez le faire avec l'API de réflexion (Plus précisément, voir le setAccessible () méthode). Quoi qu'il en soit, c'est un hack et peut ne pas fonctionner s'il y a un SecurityManager installé dans la machine virtuelle.

25

Vous pouvez accéder à une variable privée de n'importe quelle classe, mais c'est une mauvaise idée, car vous enfreignez l'un des principes de base de l'encapsulation POO.

Mais parfois les programmeurs sont forcés de le casser. Voici le code, ce qui permet de résoudre votre problème:

classe étendue

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

} 

}

et appelez exemple:

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

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

Vous n'avez pas besoin d'étendre ZoomableChart pour obtenir privé variable. Vous pouvez obtenir de la valeur presque de partout. Mais rappelez-vous - c'est généralement une mauvaise pratique.

Questions connexes