Java - Erişim değiştiricileri ve Reflection

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
Erişim Değiştiricileri

Erişim değiştiricileri (Access modifiers), Java'da bir classa ve onun içerisinde bulunan öğelere / üyelere bir erişim seviyesi vermemizi ve dışarıdan - gereksiz - erişimi engellememize yarar. Fakat buna rağmen dışarıdan erişim tamamen engellenemez, bu yüzden gereksiz olarak tanımladım. Bu konuya Reflection adı altında değineceğiz.

Erişim değiştiricileri Java'da 4 adettir. Bunlar;

1. Public
2. Protected
3. Package-Protected (Varsayılan)
4. Private

Public

Public, herkese açık demektir. Yani herkes erişebilir. Public Java'daki en geniş erişim değiştiricisidir.

Protected

Protected, sadece aynı package (adres / alan adı) üzerinden veya bir subclass tarafından erişime izin verir. Yani mesela java.lang.Object classı bir public classtır, fakat mesela java.lang.Object#finalize methodu protected erişim değiştiricisine sahip olduğu için, siz java.lang adlı pakette olmayan bir classtan da - onu extendleyerek, her class varsayılan olarak java.lang.Object'i extendlediği için siz extendlemesinizde olur - finalize methodunu override edebilir veya super.finalize() şeklinde erişebilirsiniz.

Ek Not: Sub-package'ler Protected veya Package-Protected üyelere erişemez. Mesela com.lifemcserver paketinde olan bir üyeye - eğer protected veya package protected ise - com.lifemcserver.test paketinden erişemeyiz. Tam tersini yaparsak yine erişemeyiz. Burada sub-package benim verdiğim bir ad. Paket ismi aynı değil sonuçta.

Package-Protected

Protected ile aynıdır. Tek farkı subclasslardan erişime izin vermez. Bu erişim değiştiricisi varsayılandır (bazı istisnalar dışında, mesela bir interface'de her üye varsayılan olarak public olur). Bir keywordu yoktur. Yani eğer bunu kullanmak istiyor iseniz protected, public, private vb. hiçbir şey yazmayacaksınız ve varsayılan olarak bu gelecek. Protected ile karıştırmayın.

Private

Private, o üyenin sadece bulunduğu class içerisinde erişilebileceğini tanımlar. Protected veya Package-Protected'dan farkı ise o paketteki herkes yerine, sadece o üyenin bulunduğu classtan erişime izin verilir. Java'daki en katı erişim değiştiricisi Private'dir.

Reflection

Reflection, Java'nın bize normalde erişemediğimiz üyelere erişmemiz için sunduğu bir güzelliktir. Güzelliğinin yanı sıra tabii ki normal erişime göre çok daha yavaştır ve eğer çok gerekli değil ise kullanılmamalıdır. Reflection tabii ki sadece erişilemeyen şeylere erişmek için değil mesela runtime'da (çalışma zamanında) kullanıcıdan alınan veriye göre işlem yapmak için vesaire de kullanılabilir.

Mesela normalde bir public static methodu ClassAdı.methodAdı(); şeklinde yürütüyor isek Reflection ile ClassAdı.getDeclaredMethod("methodAdı").invoke(...); şeklinde yürütürüz. Üç nokta koyduğum kısma method argümanları veya method static değil ise instance girebiliriz, örnek olduğu için üç nokta koydum. Burada methodAdı runtime da alınabilecek bir veri de olabileceği için, çalışma zamanında ki değerlere göre işlemler yapabiliriz.

Kısaca Reflection güzeldir, bize özgürlük sağlar, fakat yavaştır. Hatta çoğu yerde çoğu zaman bad-magic olarak geçer. Bugünkü NMS kullanan ve normal Bukkit API'si ile mümkün olmayan şeyleri yapan çoğu eklenti de Reflection kullanılarak yapılmıştır. Bu genelde hissedilmese de bir yavaşlık sağlar tabii ki. Doğru kullanıldığında çokta problem çıkarmayacaktır fakat yine de direk erişim kadar güvenli ve hızlı olmayacaktır.

Diğer Konular

Java - Nedir bu NullPointerException?
Java - Nedir bu static ve this?
Java - Kullandığım ve önerdiğim araçlar
Java - Tüm hataları yakalamak
 


javabey

git add Brain.java in/earth/people/brainless
Mesajlar
176
En iyi cevaplar
0
Beğeniler
180
Puanları
330
Ruh hali
reflectionlar lanetli yaratıklardır bulaşmamanızı tavsiye ederim ^^
 
Son düzenleme:

LifeMCServer

Nether Yerlisi
Mesajlar
2,410
En iyi cevaplar
98
Beğeniler
2,461
Puanları
10,250
Ruh hali
reflectionlar lanetli yaratıklardır bulaşmamanızı tavsiye ederim ^^

Asıl konuyu erişim değiştiricileri üzerine yazdım fakat onlara girince reflectionada girmem gerekti :D Bir de türkçe karşılığını bulamadım henüz. Access modifiers'a erişim değiştiricileri diyorumda reflections özel isim gibi bir şey. Gölge / yansıma tarzı bir anlam çıkıyor çevirince :D
 

GodofMilker

Nether Yerlisi
Mesajlar
2,196
En iyi cevaplar
0
Beğeniler
2,562
Puanları
6,700
Asıl konuyu erişim değiştiricileri üzerine yazdım fakat onlara girince reflectionada girmem gerekti :D Bir de türkçe karşılığını bulamadım henüz. Access modifiers'a erişim değiştiricileri diyorumda reflections özel isim gibi bir şey. Gölge / yansıma tarzı bir anlam çıkıyor çevirince :D
Yansıtma doğru kelime büyük ihtimalle
aktif olan şeylerden verdiğimiz classı bulup onun metodunu kullanıyor, ki yansıtmakla benzer şeyler fln
 

Üst