logo

Java Yansıma API'si

Java Yansıması bir Bir sınıfın çalışma zamanındaki çalışma zamanı davranışını inceleme veya değiştirme süreci .

java.lang.Class sınıf, meta verileri almak, incelemek ve bir sınıfın çalışma zamanı davranışını değiştirmek için kullanılabilecek birçok yöntem sağlar.

Java.lang ve Java.lang.reflect paketleri, Java yansıması için sınıflar sağlar.

Nerede kullanılır?

Reflection API'si esas olarak aşağıdaki alanlarda kullanılır:

  • IDE (Entegre Geliştirme Ortamı), örneğin Eclipse, MyEclipse, NetBeans vb.
  • Hata ayıklayıcı
  • Test Araçları vb.
Biliyor musunuz?
  • Class sınıfının örneğini kaç farklı yoldan alabiliriz?
  • Javap aracı nasıl oluşturulur?
  • Appletviewer aracı nasıl oluşturulur?
  • Özel yönteme sınıf dışından nasıl erişilir?

java.lang.Class sınıfı

Java.lang.Class sınıfı esas olarak iki görevi gerçekleştirir:

tarihformat.format
  • Çalışma zamanında bir sınıfın meta verilerini almak için yöntemler sağlar.
  • Bir sınıfın çalışma zamanı davranışını incelemek ve değiştirmek için yöntemler sağlar.

Class sınıfının yaygın olarak kullanılan yöntemleri:

YöntemTanım
1) public String getName()sınıf adını döndürür
2) public static Class forName(String className), ClassNotFoundException'ı atarsınıfı yükler ve Class sınıfının referansını döndürür.
3) public Object newInstance(), InstantiationException,IllegalAccessException'ı ataryeni örnek oluşturur.
4) genel boolean isInterface()arayüz olup olmadığını kontrol eder.
5) public boolean isArray();dizi olup olmadığını kontrol eder.
6) genel boolean isPrimitive()ilkel olup olmadığını kontrol eder.
7) genel Sınıf getSuperclass()üst sınıf sınıf referansını döndürür.
8) public Field[] getDeclaredFields(), SecurityException'ı atarbu sınıfın toplam alan sayısını döndürür.
9) public Method[] getDeclaredMethods(), SecurityException'ı atarbu sınıfın toplam yöntem sayısını döndürür.
10) public Constructor[] getDeclaredConstructors(), SecurityException'ı atarbu sınıfın toplam yapıcı sayısını döndürür.
11) public Yöntem getDeclaredMethod(String name,Class[] parametreTypes), NoSuchMethodException,SecurityException'ı ataryöntem sınıfı örneğini döndürür.

Class sınıfının nesnesi nasıl alınır?

Class sınıfının örneğini almanın 3 yolu vardır. Bunlar aşağıdaki gibidir:

  • Class sınıfının forName() yöntemi
  • Object sınıfının getClass() yöntemi
  • .class sözdizimi

1) Class sınıfının forName() yöntemi

  • Sınıfı dinamik olarak yüklemek için kullanılır.
  • Class sınıfının örneğini döndürür.
  • Sınıfın tam adını biliyorsanız kullanılmalıdır. Bu, ilkel türler için kullanılamaz.

forName() yönteminin basit örneğini görelim.

Dosya adı: Test.java

 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

Çıktı:

 Simple 

2) Object sınıfının getClass() yöntemi

Class sınıfının örneğini döndürür. Türü biliyorsanız kullanılmalıdır. Üstelik primitiflerle de kullanılabilir.

Dosya adı: Test.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

Çıktı:

Simple 

3) .class sözdizimi

Bir tür mevcutsa ancak örnek yoksa, türün adına '.class' eklenerek bir Sınıf elde etmek mümkündür. İlkel veri türleri için de kullanılabilir.

Dosya adı: Test.java

 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

Çıktı:

 boolean Test 

Sınıf nesnesini belirleme

Sınıf nesnesini belirlemek için Class sınıfının aşağıdaki yöntemleri kullanılır:

1) genel boolean isInterface(): Belirtilen Class nesnesinin bir arayüz türünü temsil edip etmediğini belirler.

2) genel boolean isArray(): bu Class nesnesinin bir dizi sınıfını temsil edip etmediğini belirler.

3) public boolean isPrimitive(): Belirtilen Class nesnesinin ilkel bir türü temsil edip etmediğini belirler.

Nesne türünü belirlemek için basit yansıma API örneğini görelim.

Dosya adı: Test.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

Çıktı:

homojen karışım
 false true 

Yansımanın Artıları ve Eksileri

Java yansıması her zaman dikkatli kullanılmalıdır. Yansımanın birçok avantajı olmasına rağmen bazı dezavantajları da vardır. Önce avantajlarından bahsedelim.

Artıları: Çalışma zamanı sırasında arayüzlerin, sınıfların, yöntemlerin ve alanların incelenmesi, derleme zamanı sırasında adları kullanılmasa bile yansıma kullanılarak mümkündür. Ayrıca yöntemleri çağırmak, bir temizlemeyi başlatmak veya yansımayı kullanarak alanların değerini ayarlamak da mümkündür. Geliştiricilere doğru kodu yazma konusunda yardım sağlayan Görsel Geliştirme Ortamlarının ve sınıf tarayıcılarının oluşturulmasına yardımcı olur.

Eksileri: Yansıma kullanılarak kapsülleme ilkeleri çiğnenebilir. Yansıma kullanarak bir sınıfın özel yöntemlerine ve alanlarına erişmek mümkündür. Bu nedenle, yansıma önemli verileri dış dünyaya sızdırabilir ve bu da tehlikelidir. Örneğin, bir kişi bir sınıfın özel üyelerine erişirse ve ona null değer ayarlarsa, aynı sınıfın diğer kullanıcısı NullReferenceException'ı alabilir ve bu davranış beklenmez.

Diğer bir dezavantaj ise performanstaki ek yüktür. Yansımadaki tipler dinamik olarak çözümlendiğinden JVM (Java Virtual Machine) optimizasyonu gerçekleşememektedir. Bu nedenle yansımalarla yapılan işlemler genellikle yavaştır.

Çözüm

Yukarıda belirtilen dezavantajlardan dolayı, genellikle yansımayı kullanmaktan kaçınmak tavsiye edilir. Yalnızca dilin temelleri hakkında iyi bilgiye sahip programcılar veya geliştiriciler tarafından kullanılması gereken gelişmiş bir özelliktir. Her zaman hatırla! Yansıma kullanıldığında uygulamanın güvenliği tehlikeye girer.


Reflection API Eğitiminin Sonraki Konuları

newInstance() yöntemi
Javap aracını anlama
javap aracı oluşturma
appletviewer aracı oluşturma
Başka bir sınıftan özel yöntemi çağırın