-- Java SE

Reflection API – Sınıflar

Java Reflection runtime sırasında sınıfları, interfaceleri, metodları inceleme imkanı sunar. Ayrıca reflection kullanarak yeni bir nesne üretmek, metot çağırmak, değerleri get/set etmek de mümkündür.

Sınıfları araştırmak reflection kullanılırken genellikle yapılan ilk şeydir. Sınıflardan çeşitli bilgiler elde edilebilir, bunlardan bazıları :

– Class Name (Sınıf ismi)
– Class Modifies (public, private, synchronized vs.)
– Package Info (Paket Bilgisi)
– Superclass
– Implemented Interfaces (Implement edilen arayüzler)
– Constructorlar
– Metotlar
– Fields (Alanlar)
– Anotasyonlar

Sınıf Nesnesi

Bir sınıf üzerinde araştırma yapmaya başlamadan önce o sınıfa ait java.lang.Class nesnesini oluşturmak gerekir. Java içerisindeki primitive tipler ve arraylar dahil tüm tiplerin Class nesnesiyle bağlantısı vardır. Aşağıdaki şekilde Class nesnesi oluşturulabilir.

  // Nesne varsa
        String str = new String("Test Nesnesi");

        Class strClass = str.getClass();
        // Nesne yoksa
        Class clss = null;
        try {
           clss = Class.forName("java.lang.String");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } 

Class.forName() metodu kullanılacağı zaman paket dahil tam sınıf ismi geçilmelidir ve belirtilen sınıf bulunmazsa bu metod ClassNotFoundException hatası fırlatır.

Sınıf İsmi

Bir Class nesnesinden iki farklı formda sınıf ismi elde edilebilir. Tam sınıf ismi(paket dahil) getName() metodu ile paket ismi olmadan ise getSimpleName() metodu ile alınabilir.

   String str = new String("Test Nesnesi");

        Class strClass = str.getClass();
        
        String fullClassName = strClass.getName(); // java.lang.String
        String simpleClassName = strClass.getSimpleName(); // String

        System.out.println(fullClassName);
        System.out.println(simpleClassName);

Modifiers

Class nesnesi üzerinden nesnenin ait olduğu sınıfın erişim belirleyicisine(Modifier) ulaşılabilir.

Class  aClass = ... // Class Nesnesini Oluşturma
  int modifiers = aClass.getModifiers();

getModifiers() metodu hedef sınıfın erişim belirleyicisinin int değerini dönderir. Örneğin java.lang.String sınıfı public final olup int değeri 17‘dir. Bu belirleyicileri tek tek kontrol etmek için java.lang.reflect.Modifier sınıfı içerisindeki aşağıdaki boolean değer dönderen metotlar kullanılabilir, direk öğrenilmek isteniyorsa toString() metodu kullanılabilir.

    Modifier.isAbstract(int modifiers)
    Modifier.isFinal(int modifiers)
    Modifier.isInterface(int modifiers)
    Modifier.isNative(int modifiers)
    Modifier.isPrivate(int modifiers)
    Modifier.isProtected(int modifiers)
    Modifier.isPublic(int modifiers)
    Modifier.isStatic(int modifiers)
    Modifier.isStrict(int modifiers)
    Modifier.isSynchronized(int modifiers)
    Modifier.isTransient(int modifiers)
    Modifier.isVolatile(int modifiers)

Aşağıdaki kod parçası java.lang.String sınıfının erişim belirleyicisi hakkında bilgi verir.

        String str = new String("Test Nesnesi");
        Class strClass = str.getClass();

        int modifiers = strClass.getModifiers();

        System.out.println(modifiers); // 17
        System.out.println(Modifier.isPublic(modifiers)); // true
        System.out.println(Modifier.isFinal(modifiers));  // true
        System.out.println(Modifier.isAbstract(modifiers)); // false
        System.out.println(Modifier.toString(modifiers)); // public final

Paket bilgisi 

Class  aClass = ...
Package package = aClass.getPackage();

Bu şekilde elde edilen Package nesnesinden sonra, bu nesne üzerinden paket ismi gibi bilgiler elde edilebilir. Bu paket için Manifest ya da JAR dosyasında belirtilen bilgilere erişim sağlanamabilir. JAVA API içerisinden java.lang.package içeriğine bakmakta fayda var.

Superclass

Class superclass = aClass.getSuperclass();

Bu superclass isimli Class nesnesin diğer Class nesnelerinden bir farkı yoktur. Bu nesne üzerinden reflection işlemine diğer nesnelerdeki gibi devam edilebilir.

Implemented Interfaces ( Arayüzler )

Class  aClass = ... 
Class[] interfaces = aClass.getInterfaces();

Bir sınıf birden çok interface uygulayabilir. Bu yüzden getInterfaces() metodu bir Class arrayi dönderir.

NOT : Bir sınıf içerisindeki özellikle implement edildiği belirtilen interfaceler bu array içerisine atılır. Örneğin, A,B,C interfacelerini impelement eden bir superclass’ın alt sınıfı  da otomatik olarak bu interfaceleri uygular. Ancak bu alt sınıf için getInterfaces() metodu çağırıldığında array içerisinde üst sınıfın uyguladığı A,B,C interfaceleri atılmaz.

Constructorlar

 Constructor[] constructors = aClass.getConstructors();

Metotlar

 Method[] method = aClass.getMethods();

Fieldler

 Field[] fields = aClass.getFields(); // member variable - sınıf değişkenleri

Anotasyonlar

 Annotation[] annotations = aClass.getAnnotations();

Yorum bırak

Yorum