, bu bir dış sınıfın bir örneği ile ilişkilidir. Merakla, iç sınıfı bir dış sınıfın başka bir örneği ile ilişkilendirmek mümkün mü?Java'da bir iç sınıfın dış sınıf örneğini değiştirmek mümkün mü? bir iç sınıfı örneği oluşturulduğunda Java'da
cevap
Evet, bu mümkün, bana gerçekten kötü bir fikir gibi geliyor olsa da. Buradaki fikir, aksi takdirde final
işaretçisini yansımayı kullanarak (başarılı olması garanti edilmez) dış örneğe ayarlamaktır.
import java.lang.reflect.*;
public class Me {
final String name;
Me(String name) {
this.name = name;
}
class InnerMe {
String whoAreYou() {
return name;
}
}
InnerMe innerSelf() {
return new InnerMe();
}
public static void main(String args[]) throws Exception {
final Me me = new Me("Just the old me!");
final InnerMe innerMe = me.innerSelf();
System.out.println(innerMe.whoAreYou()); // "Just the old me!"
Field outerThis = innerMe.getClass().getDeclaredFields()[0];
outerThis.setAccessible(true);
outerThis.set(innerMe, new Me("New and improved me!"));
System.out.println(innerMe.whoAreYou()); // "New and improved me!"
}
}
burada çok önemli bir parçasıdır outerThis.setAccessible(true);
- bir SecurityManager başarı bu yasaklayan bir politikayı zorunlu olabilir. Kenara ondan
Sen yansıma kullanarak, mümkün olmalıdır.
Sadece iç sınıfı (getClass().getDeclaredFields()
) tüm alanlarını almak ve saha ebeveyn tutan bkz sonra (field.set(innerInstance, newParent)
kullanmadan önce erişilebilir alanını yapmak gerektiğini söyledi. - setAccessible(true)
) ile ayarlama alan görünmektedir yana
final
olmak, bunu aşmak için nasıl olduğunu görmek için this article bir göz sürebilir.
setAccessible(true)
olmadan) mümkün değildir Ancak
public class Outer {
public class Inner {}
}
...
Outer o = new Outer();
Outer.Inner i = o.new Inner();
: Eğer örnekleme süresi hakkında konuşan varsa
, aşağıdaki sözdizimini kullanarak mümkündür , saha içine örneğine işaret çünkü final
geçerli:
javap Outer$Inner
Compiled from "Outer.java"
public class Outer$Inner extends java.lang.Object{
final Outer this$0;
public Outer$Inner(Outer);
}
(+1), final ile iyi nokta. O.new Inner() için – Bozho
+1 - Bugün yeni bir sözdizimi öğrendim. –
- 1. Dış sınıfın "bu" bir iç sınıftan nasıl erişilebilir?
- 2. Python'da statik iç sınıf
- 3. Dış sınıftan erişen iç sınıf
- 4. Bir Java iç sınıfı için sınıf başvurusu
- 5. bir iç sınıf nesnesi Özetle
- 6. Java iç içe erişim sınıfı dış sınıf değişkenleri
- 7. İç içe geçmiş sınıflı soyut sınıf bu mümkün mü?
- 8. İç Yönlendirme Sınıfı iç işlevini kullanma
- 9. Yazıcı ile javada dizileri kullanma
- 10. Java Groovy iç/dış sınıf tutarsızlık vs
- 11. Özel iç sınıf, beklenmeyen anonim sınıfı sentezler
- 12. Nunit: Testlerin iç içe geçmesi mümkün mü?
- 13. Şablon sınıfı 'iç sınıfın eşleştiricisi için doğru sözdizimi?
- 14. Salatalık javada senaryo adı nasıl alınır?
- 15. Scala'da bir iç sınıf nasıl "geçersiz kılınır"?
- 16. Java İç Sınıfı
- 17. Dış sınıflar tarafından iç içe geçmiş bir sınıfın erişime izin vermesine izin ver ancak izin verilsin
- 18. Golang iç içe geçmiş işlevi iç sınıf
- 19. sınıf nesnesinden sınıf sınıfı
- 20. İç sınıftaki
- 21. Aşırı yük işletmecisi << iç içe geçmiş bir özel sınıf için mümkün mü?
- 22. Scala'da bir iç sınıf türüne gönderme
- 23. Bu bir İç Sınıf mı
- 24. Sınıfın bir iç sınıf mı yoksa kullanıcı sınıfı mı olduğunu nasıl anlarsınız?
- 25. Bir sınıf örneğini DWScript
- 26. Python'da bir işlevin reprini değiştirmek mümkün mü?
- 27. Statik bir iç sınıf yapıcıdan bir Spring bean nasıl oluşturulur?
- 28. Javascript Şablonları - Derin iç içe mümkün mü
- 29. Gradle ProGuard sonra iç sınıfın sembolü bulamıyorum
- 30. Bir iç sınıf bildirmeyi nasıl yönlendirebilirim?
gelecek Karartılmış java yarışmalarda potansiyel var, ne anlamı var? Biliyorsunuz ki, eğer bir ebeveyn sınıfından ayrılabilir bir iç sınıf istiyorsanız, onu sadece statik olarak ilan edebilirsiniz, değil mi? –
Bu sorunu büyüleyici buluyorum. JLS'de, dış sınıfa işaretçinin nasıl isimlendirildiğini bilen biri var mı? Deneme yoluyla, '$ 0' gibi görünen, gerektiği kadar '$' eklenerek (muhtemelen hiçbiri) görünmüyor. Bu aslında belirtiliyor mu? – polygenelubricants
Tamam Daha yeni bir seviye iç sınıfın bunun yerine $ 1 $ kullandığını öğrendim. Büyüleyici! – polygenelubricants