Java – Reflection

Reflection java da sınıf, method, attribute gibi bilgilere erişmeyi ve bunlar üzerinde işlem yapmayı saglayan bir kütüphanedir. Reflection ile dinamik olarak nesnenin özelliklerine erişebilirsiniz.
Öncelikle üzerinde çalışmamız için OrnekSinif isminde bir sınıf oluşturalım.

    public class OrnekSinif {
     public OrnekSinif(){
     
     }
     public OrnekSinif(String ad){
     
     }
     String ad;
     String soyad;
     
     public void kayit(){
     }
     public String degerDondur(){
      return "";
     }
     public int topla(int x, int y){
      return x+y;
     }
    }

Şimdi bu sınıftaki metodları listeleyelim öncelikle sınıfa ait class nesnesini almamız gerekiyor sonrasında o sınıfa ait istediğimiz bilgiye erişebiliriz.

    import java.lang.reflect.Method;
    public class Demo {
     
     public static void main(String[] args) {
      Class ornekSinif = OrnekSinif.class;
      Method[] methods = ornekSinif.getDeclaredMethods();
      for (int i = 0; i < methods.length; i++){
       System.out.println(methods[i].toString());
      }
     }
    }

Bu kodun çıktısı aşağıdaki gibi olacaktır.

public void OrnekSinif.kayit()
public java.lang.String OrnekSinif.degerDondur()
public int OrnekSinif.topla(int,int)

Şimdi bu sınıfa ait constructer ları (kurucu metodları) listeleyelim

    import java.lang.reflect.Constructor;
     
    public class Demo {
     
     public static void main(String[] args) {
      Class ornekSinif = OrnekSinif.class;
      Constructor[] cons = ornekSinif.getDeclaredConstructors();
      for (int i = 0; i < cons.length; i++){
       System.out.println(cons[i].toString());
      }
     }
    }

Bu kodun çıktısıda aşağıdaki gibi olacaktır göründüğü gibi iki adet kurucu metodumuzu listeledi.

public OrnekSinif()
public OrnekSinif(java.lang.String)

Reflection ile benzer şekilde fieldları, annotationları, super classları, interfaceleri vs.. alabiliriz. Bunlar haricinde java da yine dinamik olarak nesneler oluşturulabiliyor. Eğer Class.forName(“OrnekSinif”).newInstance(); dersek bize OrnekSinif tipinde bir nesne oluşturacaktır.

Nov 27th, 2008
  1. Nov 28th, 2008 at 13:48 | #1

    Selamlar. Yazilar guzel. Reflection kolaylastirmak icin bir mini kutuphane var, isteyen bakabilir..

    http://fest.easytesting.org/reflect/wiki/pmwiki.php

    Fest’in diger kutuphaneleri de cok hos.

  2. Nov 29th, 2008 at 15:33 | #2

    Melih Hocam Selamlar;

    Reflection konusunu merak edenler için güzel bir başlangıç.

    Fakat ekibimdeki arkadaşları mümkün mertebe reflection’dan uzak tutmaya çalışıyorum. Birşeylerin runtime ‘da şekil alıyor olması hata olduğunda hatayı bulmayı zorlaştırıyor.

    Reflection’ı genelde kişisel geliştirilen projeler veya finalize edilme aşamasındaki projelerde veya çalışan personlin değişmediği stabil şirketlerde uygun görüyorum..
    Genelde zaten reflection kod üretimi gibi bir defaya mahsus ve runtime aşamasında tekrar edilmeyen işlerde tercih ediliyor.

    Aksi halde bilinçsiz ellerde kötü bir silaha dönüşebilir :)

    Kolay gelsin..

  3. Nov 29th, 2008 at 22:52 | #3

    Ibrahim bey, su anki pek cok populer projede Reflection kullaniliyor . Ornegin Dependency Injection, sirf Reflection’a dayaniyor. Ama temelde sizinle hemfikirim. benim gorusume gore reflection bir API icerisine sarmalanirsa kullanilmasinda mahsur yok. commons beans, ya da annotation tabanli pek cok kutuphanede reflection sart oluyor. bu sekilde bilincsiz ellere dusmesine de musade edilmez.

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>