Java Örnekle Reflection API Eğitimi
⚡ Akıllı Özet
Java Reflection API, çalışma zamanında bir sınıfın yeteneklerini (alanları, metotları ve kurucuları dahil) analiz eder ve değiştirir. Bu kaynak, java.lang.reflect paketini, java.lang.Class'ın temel metotlarını ve bir sınıfın, değişkenin, metodun ve kurucunun meta verilerini okuyan dört örneği açıklamaktadır.

Yansıma Nedir? Java?
Java Yansıma (Reflection), bir sınıfın tüm yeteneklerini çalışma zamanında analiz etme ve değiştirme işlemidir. Yansıma API'si şu şekildedir: Java Bu, bir sınıfı ve üyelerini (alanlar, metotlar, kurucular vb.) çalışma zamanında değiştirmek için kullanılır.
Yansıma API'sinin avantajlarından biri şudur: Java Bu, sınıfın özel üyelerini de manipüle edebilmesidir.
`java.lang.reflect` paketi, yansımayı uygulamak için birçok sınıf sağlar. `java.lang.Class` sınıfının yöntemleri, belirli bir sınıfın tüm meta verilerini toplamak için kullanılır.
Java.lang.reflect Paketindeki Sınıf
Aşağıdakilerin bir listesi çeşitli Java sınıflar Yansıma (reflection) özelliğini uygulamak için `java.lang.reflect` paketini kullanın:
- Alan: Bu sınıf, bir değişkenin veri türü, erişim değiştiricisi, adı ve değeri gibi bildirimsel bilgileri toplamak için kullanılır.
- Yöntem: Bu sınıf, bir metodun erişim değiştiricisi, dönüş türü, adı, parametre türleri ve istisna türü gibi bildirimsel bilgileri toplamak için kullanılır.
- Inşaatçı: Bu sınıf, bir kurucunun erişim değiştiricisi, adı ve parametre türleri gibi bildirimsel bilgileri toplamak için kullanılır.
- değiştirici: Bu sınıf, belirli bir erişim değiştirici hakkında bilgi toplamak için kullanılır.
Java.lang.Class'ta kullanılan yöntemler
- public String getName(): Sınıfın adını döndürür.
- public Class getSuperclass(): Üst sınıf referansını döndürür.
- public Class[] getInterfaces(): Belirtilen sınıf tarafından uygulanan arayüzlerin bir dizisini döndürür.
- public int getModifiers(): Belirtilen sınıfın değiştiricilerini temsil eden bir tamsayı değeri döndürür; bu değer, verilen sınıf için erişim belirleyicisini döndüren "public static String toString(int i)" yöntemine parametre olarak geçirilmelidir.
Bir sınıf hakkında tam bilgi nasıl alınır?
Hakkında bilgi almak için değişkenlerBir sınıfın metotlarını ve kurucularını kullanarak, o sınıfın bir nesnesini oluşturmamız gerekir. Aşağıdaki örnek, "Class" sınıfının bir nesnesini oluşturmanın farklı yollarını göstermektedir:
public class Guru99ClassObjectCreation { public static void main(String[] args) throws ClassNotFoundException { // 1 - By using Class.forName() method Class c1 = Class.forName("Guru99ClassObjectCreation"); // 2 - By using getClass() method Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation(); Class c2 = guru99Obj.getClass(); // 3 - By using .class Class c3 = Guru99ClassObjectCreation.class; } }
Örnek 1: Sınıfın Meta Verilerine Nasıl Ulaşılır?
Aşağıdaki örnek, bir sınıfın sınıf adı, üst sınıf adı, uygulanan arayüzler ve erişim değiştiricileri gibi meta verilerinin nasıl elde edileceğini göstermektedir.
Aşağıda adı geçen sınıfın meta verilerini alacağız. Guru99Base.class:
import java.io.Serializable; public abstract class Guru99Base implements Serializable, Cloneable { }
- Sınıfın adı şudur: Guru99Temel
- Erişim değiştiricileri şunlardır: public ve abstract
- Arayüzleri uyguladı: Serileştirilebilir ve Klonlanabilir
- Herhangi bir sınıfı açıkça genişletmediği için, üst sınıfı şudur: java.lang.Object
Aşağıdaki sınıf, meta verilerini alacaktır. Guru99Base.class dosyasını oluşturun ve yazdırın:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main(String[] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class<Guru99Base> guru99ClassObj = Guru99Base.class; // Print name of the class System.out.println("Name of the class is : " + guru99ClassObj.getName()); // Print super class name System.out.println("Name of the super class is : " + guru99ClassObj.getSuperclass().getName()); // Get the list of implemented interfaces using getInterfaces() method Class[] guru99InterfaceList = guru99ClassObj.getInterfaces(); // Print the implemented interfaces using a for-each loop System.out.print("Implemented interfaces are : "); for (Class guru99class1 : guru99InterfaceList) { System.out.print(guru99class1.getName() + " "); } System.out.println(); // Get access modifiers using getModifiers() and Modifier.toString() int guru99AccessModifier = guru99ClassObj.getModifiers(); System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier)); } }
- getName() yöntemini kullanarak sınıfın adını yazdırın.
- getSuperclass().getName() yöntemini kullanarak üst sınıfın adını yazdırın.
- Uygulanan arayüzlerin adlarını yazdırın.
- Sınıf tarafından kullanılan erişim değiştiricilerini yazdırın.
Örnek 2: Değişkenin Meta Verilerine Nasıl Ulaşılır?
Aşağıdaki örnek, bir değişkenin meta verilerinin nasıl alınacağını göstermektedir.
Burada, bir sınıf oluşturuyoruz. Guru99VariableMetaData.class dosyası bazı değişkenlerle birlikte:
package guru; public class Guru99VariableMetaData { public static int guru99IntVar1 = 1111; static int guru99IntVar2 = 2222; static String guru99StringVar1 = "guru99.com"; static String guru99StringVar2 = "Learning Reflection API"; }
Yukarıdaki sınıftaki değişkenlerle ilgili meta verileri alma adımları:
- Yukarıdaki sınıfın sınıf nesnesini oluşturun, yani: Guru99VariableMetaData.class, aşağıdaki gibidir:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Meta verileri, bir Alan dizisi biçiminde elde etmek için şunu kullanın: getFields() or getDeclaredFields() aşağıdaki gibi yöntemler:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
MKS getFields() Bu yöntem, belirtilen sınıfın yanı sıra üst sınıfındaki herkese açık değişkenlerin meta verilerini döndürür.
MKS getDeclaredFields() Bu yöntem yalnızca belirtilen sınıfa ait tüm değişkenlerin meta verilerini döndürür.
- “public String getName()” yöntemini kullanarak değişkenlerin adlarını alın.
- “public Class getType()” metodunu kullanarak değişkenlerin veri türünü alın.
- “public xxx get(Field)” metodunu kullanarak değişkenin değerini alın. Burada xxx, bir bayt, kısa tamsayı veya almak istediğimiz herhangi bir değer türü olabilir.
- getModifiers() ve Modifier.toString(int i) yöntemlerini kullanarak değişkenlerin erişim değiştiricilerini alın.
Burada, sınıfta bulunan değişkenlerin meta verilerini almak için bir sınıf yazıyoruz. Guru99VariableMetaData.class:
package guru; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableMetaData.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields(); // Print name, data types, access modifiers and values of the variables for (Field field : guru99Field1) { System.out.println("Variable name : " + field.getName()); System.out.println("Datatype of the variable : " + field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : " + field.get(guru99ClassVar)); System.out.println(); } } }
- Bir sınıf nesnesi oluşturuldu. Guru99VariableMetaData.class.
- Bir Field dizisindeki değişkenlerin tüm meta verilerini aldım.
- Sınıftaki tüm değişken adlarını yazdırdı. Guru99VariableMetaData.class.
- Sınıftaki tüm değişkenlerin veri tiplerini yazdırdı.
- Sınıftaki tüm değişkenlerin erişim değiştiricilerini yazdırdı.
- Sınıftaki tüm değişkenlerin değerlerini yazdırdı.
Örnek 3: Bir Metodun Meta Verilerine Nasıl Ulaşılır?
Aşağıdaki örnek, bir metodun meta verilerinin nasıl alınacağını göstermektedir.
Burada, bir sınıf oluşturuyoruz. Guru99MethodMetaData.class adlı sınıf, bazı metotlar içermektedir:
package guru; import java.sql.SQLException; public class Guru99MethodMetaData { public void guru99Add(int firstElement, int secondElement, String result) throws ClassNotFoundException, ClassCastException { System.out.println("Demo method for Reflection API"); } public String guru99Search(String searchString) throws ArithmeticException, InterruptedException { System.out.println("Demo method for Reflection API"); return null; } public void guru99Delete(String deleteString) throws SQLException { System.out.println("Demo method for Reflection API"); } }
Yukarıdaki sınıftaki metotlara ait meta verileri elde etme adımları:
- Yukarıdaki sınıfın sınıf nesnesini oluşturun, yani: Guru99MethodMetaData.class, aşağıdaki gibidir:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Aşağıdaki gibi getMethods() ve getDeclaredMethods() yöntemlerini kullanarak bir Method dizisindeki yöntem bilgilerini alın:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
MKS getMethods() Bu yöntem, belirtilen sınıfın ve üst sınıfının genel yöntemlerinin meta verilerini döndürür. getDeclaredMethods() Bu yöntem, yalnızca belirtilen sınıfa ait tüm yöntemlerin meta verilerini döndürür.
- Aşağıdaki yöntemi kullanarak metodun adını alın. getName () yöntemi.
- Metodun dönüş türünü aşağıdaki yöntemle elde edin. getReturnType() yöntemi.
- Metotların erişim değiştiricilerini aşağıdaki yöntemle elde edin. getModifiers() hem de Değiştirici.toString(int i) yöntemleri.
- Metot parametre türlerini aşağıdaki yöntemle elde edin. getParameterTypes() Bu yöntem, bir Sınıf dizisi döndürür.
- Hata fırlatmalarını şu şekilde yakalayın: getExceptionTypes() Bu yöntem, bir Sınıf dizisi döndürür.
Burada, sınıfta bulunan metotların meta verilerini elde etmek için bir sınıf yazıyoruz. Guru99MethodMetaData.class:
package guru; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class Guru99MethodMetaDataTest { public static void main(String[] args) { // Create Class object for Guru99MethodMetaData.class Class guru99ClassObj = Guru99MethodMetaData.class; // Get the metadata of all the methods using getDeclaredMethods() Method[] guru99Methods = guru99ClassObj.getDeclaredMethods(); for (Method method : guru99Methods) { System.out.println("Name of the method : " + method.getName()); System.out.println("Return type of the method : " + method.getReturnType()); int guru99ModifierList = method.getModifiers(); System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList)); Class[] guru99ParamList = method.getParameterTypes(); System.out.print("Method parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = method.getExceptionTypes(); System.out.print("Exception thrown by method : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- Bir sınıf nesnesi oluşturuldu. Guru99MethodMetaData.class.
- Tüm metotların meta verilerini bir Method dizisine aldım.
- Sınıfta bulunan tüm metot adlarını yazdırdı.
- Sınıftaki metotların dönüş tiplerini yazdırdı.
- Sınıftaki metotların tüm erişim değiştiricilerini yazdırdı.
- Metotların parametre türlerini yazdırdı.
- Metotların fırlattığı istisnaları yazdırdı.
Örnek 4: Yapıcıların Meta Verilerine Nasıl Ulaşılır?
Aşağıdaki örnek, yapıcı fonksiyonların meta verilerinin nasıl alınacağını göstermektedir.
Burada, bir sınıf oluşturuyoruz. Guru99. Farklı kurucu metotlara sahip Constructor.class:
package guru; import java.rmi.RemoteException; import java.sql.SQLException; public class Guru99Constructor { public Guru99Constructor(int no) throws ClassCastException, ArithmeticException { } public Guru99Constructor(int no, String name) throws RemoteException, SQLException { } public Guru99Constructor(int no, String name, String address) throws InterruptedException { } }
Burada, sınıfta bulunan yapıcı metotların meta verilerini elde etmek için bir sınıf yazıyoruz. Guru99Constructor.class:
package guru; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; public class Guru99ConstructorMetaDataTest { public static void main(String[] args) { // Create Class object for Guru99Constructor.class Class guru99Class = Guru99Constructor.class; // Get all the constructor information in the Constructor array Constructor[] guru99ConstructorList = guru99Class.getConstructors(); for (Constructor constructor : guru99ConstructorList) { System.out.println("Constructor name : " + constructor.getName()); int guru99Modifiers = constructor.getModifiers(); System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers)); Class[] guru99ParamList = constructor.getParameterTypes(); System.out.print("Constructor parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = constructor.getExceptionTypes(); System.out.print("Exception thrown by constructors : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- Bir sınıf nesnesi oluşturuldu. Guru99Constructor.class.
- Tüm yapıcı fonksiyonların meta verilerini bir Yapıcı fonksiyonlar dizisinde topladım.
- Sınıfta bulunan tüm kurucu fonksiyonların adlarını yazdırdı.
- Sınıftaki tüm kurucu metotların erişim değiştiricilerini yazdırdı.
- Yapıcı fonksiyonların parametre türlerini yazdırdı.
- Yapıcı fonksiyonlar tarafından fırlatılan istisnaları yazdırdı.
















