Genelde Java'da çalışma zamanında test yapmak için kullanılan Reflection(yansıma) kütüphanesini kullanarak yapabileceğimiz bazı ilginç şeyler var.
İşte Reflection kütüphanesini kullanarak yapabileceğimiz birkaç şey;
1- Normalde bir sınıfta tanımlanan private alanlara erişemediğimizi biliyoruz fakat bunu reflectionlar ile rahatça yapabiliriz. Mesela PrivateClass adında bir sınıfımız olsun ve içinde iki tane private değişken bulunsun.
package com.cengfurkan; public class PrivateClass { private String ad = "Furkan"; private int yas = 19; }bu sınıftaki private değişkenlere oluşturduğumuz Yansıma sınıfından ulaşmaya çalışalım
package com.cengfurkan; import java.lang.reflect.Field; public class Yansıma { public static void main(String[] args) { try { Class sınıf = Class.forName("com.cengfurkan.PrivateClass"); Object object = sınıf.newInstance(); Field[] fields = sınıf.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); System.out.println("Verinin adı: " + fields[i].getName() + "\t" + "Verinin tipi: " + fields[i].getType().getName()+ "\t" + "Verinin değeri: " + fields[i].get(object)); } } catch (Exception e) { System.out.println("Hata: " + e.getMessage()); } } }Ve ta da, PrivateClass sınıfındaki private değişkenlerin tipine ve içeriğine eriştik.
2- Normalde private yapıcı metodu olan bir sınıftan örnek üretemeyiz(Singleton desen hariç) Şimdi PrivateClass sınıfımızın içeriğini değiştirelim ve tekrar Yansıma sınıfından bunu mümkün hale getirelim.
package com.cengfurkan; public class PrivateClass { private String ad = "Furkan"; private int yas = 19; private PrivateClass() { System.out.println("Merhaba!"); } }
package com.cengfurkan; import java.lang.reflect.Constructor; public class Yansıma { public static void main(String[] args) { try { Class sınıf = Class.forName("com.cengfurkan.PrivateClass"); Constructor[] yMetotlar = sınıf.getDeclaredConstructors(); System.out.println("Yapıcı Metot Adı" + yMetotlar[0].getName()); yMetotlar[0].setAccessible(true); System.out.println("Sınıfın örneği: " + yMetotlar[0].newInstance()); } catch (Exception e) { System.out.println("Hata: " + e.getMessage()); } } }
3- Şimdi de bir statik değişkeni değiştirmeye bakalım. İlginç geliyor değil mi?
package com.cengfurkan; public class PrivateClass { private static String sehir = "Zonguldak"; public static String sehirAl() { return sehir; } }Şehir adında bir static string değişkenimiz ve onu return eden bir metodumuz var.
package com.cengfurkan; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class Yansıma { public static void main(String[] args) { try { Class sınıf = Class.forName("com.cengfurkan.PrivateClass"); Field[] fields = sınıf.getDeclaredFields(); fields[0].setAccessible( true ); System.out.println(PrivateClass.sehirAl()); fields[0].set( null ,"Eskişehir" ); System.out.println(PrivateClass.sehirAl()); } catch (Exception e) { System.out.println("Hata: " + e.getMessage()); } } }Artık statick değişken olan sehir değişkeni Eskişehir olarak değişti.
4- Benzer bir yolla bu sefer private metotlara erişmeyi deneyelim
package com.cengfurkan; public class PrivateClass { private static String sehir = "Zonguldak"; private int plakaKodu = 67; private String sehirAl() { return sehir; } private int kodAl() { return plakaKodu; } }görüldüğü gibi iki tane private değişken ve bunları return eden private metodlarımız var. Şimdi Yansıma sınıfından bu metodlar hakkında hangi bilgileri bulabiliyoruz bakalım
package com.cengfurkan; import java.lang.reflect.Method; public class Yansıma { public static void main(String[] args) { try { Class sınıf = Class.forName("com.cengfurkan.PrivateClass"); Object object = sınıf.newInstance(); Method[] metodlar = sınıf.getDeclaredMethods(); for (int i = 0; i < metodlar.length; i++) { System.out.println("//// Metot Başlangıcı"); System.out.println("Metod Adı: " + metodlar[i].getName()); System.out.println("Metodun Geri Dönüş Tipi: " + metodlar[i].getReturnType()); metodlar[i].setAccessible(true); System.out.println("Metodun Return Ettiği Değer: " + metodlar[i].invoke(object)); System.out.println("// Metot Bitişi"); } } catch (Exception e) { System.out.println("Hata: " + e.getMessage()); } } }Karşımıza metodların adları, geri dönüş tipleri ve ne döndürdüğü çıkıyor.
Yazımı burada bitiriyorum. Bir sonraki yazıda görüşmek üzere.
Mükemmel
YanıtlaSil