Java Reflection

Java komutları ile ilgili bilgi almak için kullanılan Java Reflection yapısı nedir, neden kullanılır ve kullanımı ile ilgili bilgiler yer alıyor.

Reflection nedir?

Reflection yapısı sınıf, metot, özellikler ve annotation ait ad, parametre gibi bilgileri almak, denetlemek ve yönetmek için kullanılır.

Örneğin; JAXB, Spring, Hibernate gibi yapılarda kullanılan annotation bilgileri reflection özelliği ile alınarak işlem yapılır.

Reflection kullanımı

Reflection kullanımı için öncelikle java.lang paketinde yer alan Class, Method, Field, Annotation sınıflarının ve metotlarını bilmek faydalı olacaktır.

Çünkü sınıf, metot ve sınıf özellikleri bu sınıflarla ifade edilir.

Temel veri yapıları(int, double, float vb.) ve sınıflarda(Object, System vb.) özel bir anlamı olan class özelliği yer alır.

Özellik bu yapılarda yer alan sınıf, metot ve annotation gibi komutlara erişimi sağlayan Class sınıfından bir nesnedir.

public class JavaReflection {

    public static void main(String[] args) {

        Class<?> intClass = int.class; // double, float, char, Object, System, String vb.

        System.out.println(intClass.getName());
        System.out.println(intClass.getPackage());

    }

}

Class sınıfı sınıf ile ilgili bilgi almak için getName, getSimpleName, getModifiers, getPackage, getSuperclass, getInterfaces, getConstructors, getMethods, getFields, getAnnotations gibi metotlara sahiptir.

Mototların dönüş değeri alınan bilgiye göre değişiklik gösterir.

Örneğin sınıf içerisindeki metotları almak için kullanılan getMethods değerinin dönüş değeri Method türünden bir dizidir.

public class JavaReflection {

    public static void main(String[] args) {

        Class<?> stringClass = String.class;

        System.out.println(stringClass.getName());
        System.out.println(stringClass.getSimpleName());
        System.out.println(stringClass.getPackage());

        Method[] methods = stringClass.getMethods();
        System.out.println("Metot sayısı: " + methods.length);
        for (Method method : methods) {
            System.out.println(method.getName() + " " + method.getParameterCount());
        }

    }

}

Method sınıfı kullanılarak metotlar hakkında bilgi alınabilir.

Reflection yapısı ile metot çalıştırılmak istenildiğinde Method sınıfında yer alan invoke metodu kullanılabilir.

Reflection yapısı ile ayrıca sınıf içerisinde yer alan private, protected gibi erişim imkanı olmayan alanlara da erişim sağlanabilir.

Private, protected metotlar erişmek için getDeclaredMethods metodu kullanılır.

Ayrıca bu private, protected metotlar getDeclaredMethod ve setAccessible metodu kullanılarak çalıştırılabilir.

Annotations

Java Reflection yapısının en önemli kullanım yeri annotations yapısıdır.

Spring, Hibernate ve JAXB (XML işlemleri) gibi yapılar reflection ve annotations özelliğini kullanarak işlem yapar.

Aşağıdaki Spring kod parçası incelendiğinde Reflection ve annotations özelliğinin kullanıldığı açıkca görülebilir.

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Spring rest api komutları

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));
    }
}

NOT: Kod parçaları örnek olması amacıyla verilmiştir.

Aşağıdaki metot parametre olarak verilen sınıf içerisindeki annotationları yazdırır.

public static void yazdir(Class<?> annotationClass) {
    for (Annotation annotation : annotationClass.getAnnotations()) {
        System.out.println(annotation.toString());
    }
}

NOT: Annotationları görebilmek için annotation’un @Retention(RetentionPolicy.RUNTIME) olarak işaretlenmesi gerekir.

Dizi oluşturma

Java reflection yapısı kullanılarak aşağıdaki gibi dizi oluşturulabilir.

public class JavaReflection {

    public static void main(String[] args) {
        int[] intArray = (int[]) Array.newInstance(int.class, 3);
        intArray[0] = 3;
        intArray[1] = 2;
        intArray[2] = 1;
        System.out.println(intArray[0]);
    }

}

Reflection yapısı kullanılarak dinamik sınıftan nesne oluşturma, sınıf yükleme işlemi, bağımlılık yönetimi(DI) gibi işlemler kolay bir şekilde yapılabilir.

Ancak reflection yapısı uygun-doğru olarak kullanılmadığında beklenmedik sonuçlar ortaya çıkabilir.

Java Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!