Java Yansıtma Kütüphanesi (Reflection API)

Yoğun java projelerinde işleri kolaylaştırmak için mutlaka kolaylaştırıcı kütüphanelere ihtiyaç duyarsınız. Bunlardan biri de benim öğrendikten sonra gerektiği yerde (abartmadan) kullandığım Java Reflection API olmuştur. Örnek olarak İTB projesinde formlar ile DVO nesnelerinin birbirine aktarılmasında (sahalar tamamen aynı) reflection kütüphanesi çok işimize yaramıştı. Özellikle Java topluluğunda çoğu geliştiriciye yardımcı araçlar bu kütüphanenin yardımıyla geliştirilmektedir. Örnek olarak kalıcı katmanlarda Object'ten türeyen her türlü sınıfı tek bir sınıf kullanarak sahaları ve tiplerini bilmeden veritabanına kaydetme işlemini yapabilirsiniz. Bu yüzden bu konudan biraz bahsetmeyi uygun buldum. Belki yazdıklarım çok açıklayıcı olmayacaktır. Ancak eğer yorumlarınızı iletirseniz daha iyi hale getirebilirim.

Java Reflection Nedir, Nasıl Kullanılır
Java Reflection (Yansıtma) bir uygulama geliştirme arayüzü olup, o anki Java Sanal Makinesindeki sınıfları, arayüzleri ve nesneleri yansıtan, temsil eden kütüphanedir. Özellikle geliştirme araçları yazarken yansıtma kütüphanesine ihtiyaç duyarız. Yansıtma kütüphanesini kullanarak;
  • Bir nesnenin sınıfını belirleriz
  • Sınıfın sahaları, metodları, yapıcıları, üst sınıfları ve değişkenleri hakkında bilgiler alabiliriz
  • Bir arayüze ait olan sabit ve metod tanımlamalarını tespit ederiz
  • Çalışma zamanına kadar ismi bilinmeyen bir sınıf örneği yaratabiliriz (Bir bakıma çalışma zamanında yeni sınıflar yaratabilirsiniz)
  • Çalışma zamanına kadar ismi bilinmese de sahaların değerini ayarlar ve alabiliriz.
  • Aynen çalışma zamanına kadar bilinmeyen metodları çalıştırabiliriz.
  • Çalışma zamanına kadar bileşenleri ve boyutu bilinmeyen diziler yaratabilir, daha sonra bu dizinin bileşenlerini değiştirebiliriz.
Çok önemli bir hatırlatma, standart java yapılarıyla yapabileceğiniz işleri Java yansıtma kütüphanesiyle yapmayın. Umulmadık zorluklar ve sorunlarla karşılaşabilirsiniz.
Eğer sınıfın ne olduğunu bilmiyorsanız maalesef yanlış yerde olduğunuzu söylemem gerekir. Sınıfı öğrenmek için Java Object Oriented Concepts dersine bir göz atmanızı tavsiye ederim.
Şimdi aşama aşama yansıtma kütüphanesini inceleyelim. Temel olarak yapmak istediğimiz ilk işlem bir nesnenin hangi sınıfa ait olduğunu bulmaktır. Sınıfı bulduktan sonra bu sınıf yardımıyla yansıtma kütüphanesinin tüm nimetlerinden faydalanabiliriz. Bunu yapmak için nesne.getClass() (Class döndürmektedir) çağrımında bulunuruz. Bu aldığımız Class tipinde nesneyi kullanarak nesnemizin metodlarını listeleyebilir, sahalarını listeleyebilir, istediğimiz sahanın get ve set metodlarını bulup çalıştırabiliriz.
Aşağıda çok basit bir, nesnenin tüm metodlarını ekrana yazdıran kodu görebilirsiniz:


// bize gerekecek tum siniflar bu pakette
import java.lang.reflect.*; 
import java.util.ArrayList;

public class MetodYazdir {
 public static void main(String[] args) {
  try {
   // once ArrayList sinifinin Class nesnesini alalim
   // getClass() metodu da kullanilabilir
   Class c = ArrayList.class;
   // daha sonra bu sinif icerisindeki tum metodlari cekelim
   Method[] m = c.getDeclaredMethods();
   // ve bu metod dizisini dolasarak bilgilerini ekrana yazalim
   for (int i = 0; i<0; i++) System.out.println(m[i].toString());
  } catch(Exception e){ e.printStackTrace(); }
 }
}

Bu kodu çalıştırdığınız zaman

public void java.util.ArrayList.add(int,java.lang.Object)
public boolean java.util.ArrayList.add(java.lang.Object)
public java.lang.Object java.util.ArrayList.clone()
…………………………………

Şeklinde uzayıp giden ve ArrayList sınıfının metodları erişim ve parametre bilgilerini gösteren çıktıyı göreceksiniz.

Bir yansıtma işlemi yapabilmek için temel olarak ilk yapılması gereken Class nesnesine ulaşmaktır. Bunun için farklı yöntemler vardır.

Class c = Class.forName("java.lang.String");
Class c = int.class;
Class c = Integer.TYPE;
Class c = Ogrenci.getClass();

Bu Class nesnesini aldıktan sonra bu nesne içerisindeki metotlar kullanılarak her türlü bilgi (sınıfla ilgili olan) rahatça alınabilir. Aşağıdaki bağları inceleyerek bu konuda hakkında daha ayrıntılı bilgilere ulaşabilirsiniz. Ayrıca örnek kodların (açıklamalı) içerisindeki ClassParser sınıfını her türlü projenizde ihtiyaçlarınız doğrultusunda kullanabilirsiniz.

 

5 yorum:

Adsız dedi ki...

Tesekkurler, cok yararli bir anlatim olmus.

Adsız dedi ki...

Bu konuyu Türkçe dinlemek benim icin sans oldu sonunda anladım.

Tesekkurler

T. E. Kalaycı dedi ki...

Yorumlarınız için ben teşekkür ederim.

Adsız dedi ki...

ustad ben konuya yeni basladım belki tamda yerimi degilmi bilmiyorum ama sunu ogrenmek isterim bu java dokumantasyon yada javadoc ben nasıl kullanabilirim yani bir metod ve ya java ile ilgi bir kod aradıgımda bu kutuphane bilgisini nasıl orenmek gerekir yada yanlış bir kod yazdıgımda bu javadoc tan nasıl yararlanabiliriz bu konuda daha detaylı bir bilgi vermeniz mumkunmudur
saygılar

T. E. Kalaycı dedi ki...

Soruları anladığım kadarıyla yanıtlayayım:

- Javadoc kullanarak geliştirilen kodlara bilgi parçacıkları koymak için: http://www.farukbozan.com/2010/04/javadoc-olusturmak/ http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html

- Java belgelemeyi kullanmak için de: http://docs.oracle.com/javase/6/docs/api/ adresinde soldaki tüm sınıflar bilgisinden veya yukarıdaki index bilgisinden yararlanabilirsiniz.