2016-03-24 9 views
0

A sınıfını değiştirmem mümkün değil, ancak 'a' değerini (yapıcıda ayarlanmış) almam gerekiyor. Bana bunu nasıl yapacağımı söyleyen var mı? Diğer bütün çözüm sihirli sınıf B.java: başka bir sınıftaki özel değişkeni bir getto ayarlamaya gerek olmadan alın,

public class A{ 
    private int a; 
    public A(int x){ 
     a = x * 10; 
    } 
} 

public class B{ 
    public B(int x){ 
     A instA = new A(x); 
    } 

    public int geta(){ 
     ??? 
    } 
} 

PS içinde gerçekleşmesi gerekiyor vs. halka hiçbir değişen, herhangi bir şekilde sınıf A değişiklik yapmak için izin değilim sınıf A'da bir alıcı önermek görünüyor: Bu soruyu yayınladım, çünkü her benzer soru A sınıfını değiştirerek cevaplandı, buna rağmen buna izin verilmedi. Ancak sadece yansıma olduğu için bu soru kapatılabilir. Teşekkürler çocuklar ve baylar.

+0

Üye değişkeni özelse, dışarıdan erişmenin tek yolu bir yöntemle… –

+3

Bir alıcıyı A'ya eklemenize izin verilmez, ancak A'yı herhangi bir şekilde değiştirmenize izin verilir mi? Eğer öyleyseniz, potansiyel olarak "private int a;" ile public int a; arasında değişiklik yapabilirsiniz. Ayrıca, lütfen bir alıcı eklemenize izin verilmediğini belirtin. –

+4

bakın: http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java –

cevap

0

En iyi karar alıcıya sahip olmaktır. En iyi uygulamaların programlanması söz konusu olduğunda en güvenli ve en temiz çözümdür.

A a = new A(5); 
Field field = A.getField("a"); 
field.setAccessible(true); 
int value = field.get(a); 
: isme göre alanını bulabilirsiniz (ne olur sınıfın bir gelecek sürümünde isim değişikliği?) Ve özü böyle bir değerdir -

Bu yansıma kullanarak istediğini elde etmek mümkündür

Ancak bunun süper hacky olarak kabul edildiğini ve şiddetle tavsiye edildiğini unutmayın.

+0

Kısmen katılıyorum, ancak alana erişmeden önce bir satır daha eklenmelidir: 'field.setAccessible (true);' – Aliaxander

+0

@Aliaxander true. –

2

özel alanlarının tümü budur; Kapsanan sınıfın kapsamı dışında erişilemezler.

Sen var aşağıdaki seçenekler:

  1. Değişim
  2. bu değeri gerekmez birine, genel tasarımını değiştirme bir alıcı sağlamak için bu sınıf; ya da başka bir
  3. önerilmez hem sınıflara kullanılabilir hale getirmek için bir yol bulmak: kullanım yansıma ve çalışma zamanında "özel" koruma geçersiz kılmak için yeteneğini
  4. İşte
+0

Teşekkürler. Özel alanların anlamını anlıyorum. Sanırım egzersiz ifadesi yanlış. Düşünmenin, kullanmak istediğimiz çözüm olduğunu düşünmüyorum. Birinin beni göremediğim bir çözüme yönlendireceğini umuyordum. Verilen yöntemleri değiştirmemize izin verilmediğini düşünüyorum, ama biraz ekleyin, aksi halde sadece yansıma olarak görünüyor ... – Peter

0

bunu

public int geta(){ 
     Field field; 
     int x = 0; 
     try { 
      field = A.class.getDeclaredField("a"); 
      field.setAccessible(true); 
      x = field.getInt(this.a); 
     } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    System.out.println(x); 
    return x; 
} 
yapabilirsiniz nasıl
İlgili konular