Java Reflection: Ne Zaman Kullanılır, Performans Maliyeti Nedir
Reflection, Java programında çalışma zamanında sınıf, metod, alan gibi bilgileri okuyup değiştirmeyi sağlar. Örneğin bir nesnenin hangi metodları olduğunu, hangi alanları taşıdığını program çalışırken öğrenebilirsin.
Reflection'ın en yaygın kullanım alanları şunlar: Dependency injection kütüphaneleri (Spring, Guice), test çatıları (JUnit), JSON-nesne dönüştürücüler (Gson, Jackson) ve plugin sistemleri. Bu araçlar derlemeden sonra hangi sınıfın ne yapacağını bilemediği için reflection kullanır.
Ancak performans maliyeti ciddi. Reflection çağrısı, normal metod çağrısından 10-100 kat daha yavaş olabilir. Sebep: reflection, runtime'da tür bilgisini arayıp doğrulaması, güvenlik kontrolü yapması ve JIT derleyicisinin optimizasyon yapamamasıdır.
Pratik örnek ile görelim. Bir sınıfın tüm metodlarını listelemek ve çağırmak:
1import java.lang.reflect.Method;23public class ReflectionDemo {4public void selamVer() {5System.out.println("Merhaba!");6}78public static void main(String[] args) throws Exception {9ReflectionDemo obj = new ReflectionDemo();1011// Reflection ile metod bulma12Method method = ReflectionDemo.class.getMethod("selamVer");13method.invoke(obj);1415// Performans karşılaştırması16long start = System.nanoTime();17for (int i = 0; i < 1_000_000; i++) {18obj.selamVer(); // Normal çağrı19}20long normalSure = System.nanoTime() - start;2122start = System.nanoTime();23for (int i = 0; i < 1_000_000; i++) {24method.invoke(obj); // Reflection çağrısı25}26long reflectionSure = System.nanoTime() - start;2728System.out.println("Normal: " + normalSure + " ns");29System.out.println("Reflection: " + reflectionSure + " ns");30System.out.println("Fark: " + (reflectionSure / normalSure) + "x");31}32}Çıktı örneği:
1Merhaba!2Normal: 2500000 ns3Reflection: 250000000 ns4Fark: 100xReflection kullan, ama akıllıca. Bir kere yapılan işlerde (uygulama başlangıcında) reflection kullan, sorun değil. Döngü içinde veya saniyede binlerce kez çağrılan yerde reflection kaçın. Örneğin Spring dependency injection başlangıçta reflection yapar; sonra cache eder, tekrar yapmaz.
Özetle: Reflection, framework ve kütüphaneler için gerekli bir araç. Ama performans kritik kodda, özellikle sıkı döngülerde kaçın. Alternatif olarak anotasyon işlemcileri (annotation processors) veya kod üretimi düşün.
3 yorum
Springde fark etmemişsin çünkü o yavaşlık bir kere başlangıçta oluyor sonra cacheleniyor Reflection ile her seferinde class bilgisi taraması yapmazsan tabii hissedilmiyor
Anlaşıldı ya o zaman niye bazı kütüphaneler reflection kullanmaktan kaçınıyor caching yapsa yeterli değil mi
Spring kullanıyorken hiç fark etmemiştim ki bu kadar pahalıya mal oluyor 10 100 kat daha yavaş demesi çok şaştırdı gerçekten o kadar farkı yol açıyor mu test ederken