2010-08-30 17 views
9

Java'da, değiştirilmeden önce değerini almak istediğim özel bir değişkeni olan bir sınıfı genişlettim. Süper değişkende bu değişkene erişmek için herhangi bir yöntem yoktur. super().m_zoomArea'u denedim (değişken, ZoomableChart jChart2D sınıfındadır). Değişken, mouseDragged yöntemi çağrıldığında güncellenir. Bu yöntemi geçersiz kıldım ve değiştirilmeden önce değişkenin değerini almak istiyorum.Java'da süper() sınıfının özel bir değişkenine erişme - JChart2D

cevap

15

Yapamazsınız. numaralı numaralıno'lu tüm değişken, değişkene ulaşamayacağınızdır. Eğer sınıf onu bulmak için herhangi bir yol vermediyse, onu elde edemezsin. Bu, sınıfta bir tasarım hatası olabilir ya da olmayabilir, ancak uygun ayrıcalıklarla ( önermiyorsa - temel olarak özel uygulama ayrıntılarına güveniyorsanız) yansıma kullanmıyorsanız, düşünmeniz gerekecek. alternatif bir yaklaşım.

2

Sınıfın dışından özel değişkenlere erişemezsiniz. Erişebilmek için korunmasını sağlamalısınız.

4

Yansımayı kullanabilirsiniz ama bu kötü bir fikir. Özel bir alan özeldir çünkü geliştirici bununla uğraşmanızı istemez.

Size burada yapmanın bir yolunu göstermeyeceğim, ancak gerçekten yaptıklarını biliyorsanız, aşağıdaki bağlantıları kendi risklerinize göre takip edin. Yine, bunu yapmayı bile düşünmemelisin. Aynı konu üzerinde


:

0

Sen setAccessible bkz Özellikle (Yansıma API ile yapabilirsiniz () yöntem). Her neyse, bu bir kesmek ve VM'de bir SecurityManager kuruluysa çalışmayabilir.

25

Herhangi bir sınıfın özel değişkenine erişebilirsiniz, ancak bu, OOP - kapsüllemenin temel ilkelerinden birini kırdığınız için kötü bir fikirdir. Ancak bazen programcı bunu kırmaya zorlanır.

Genişletilmiş sınıf

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

} 

}

ve çağrı örnek: İşte sorunu çözer koddur

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

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

Sen özel olsun ZoomableChart uzatmak gerekmez değişken. Neredeyse her yerden değer kazanabilirsin. Ama unutmayın - genellikle kötü bir uygulamadır.

İlgili konular