Java Örnekle Reflection API Eğitimi
Yansıma Nedir? Java?
Java Yansıma, bir sınıfın tüm yeteneklerini çalışma zamanında analiz etme ve değiştirme sürecidir. Yansıma API'si Java çalışma zamanında alanları, yöntemleri, yapıcıyı vb. içeren sınıfı ve üyelerini değiştirmek için kullanılır.
Yansıma API'sinin bir avantajı Java yani sınıfın özel üyelerini de manipüle edebilir.
Java.lang.reflect paketi, yansımayı uygulamak için birçok sınıf sağlar. Java.lang.Class sınıfının java.Methods'u, 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ımayı uygulamak için Java.lang.package'de
- 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 yöntemin 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 yapıcının erişim değiştiricisi, adı ve parametre türleri gibi bildirimsel bilgileri toplamak için kullanılır.
- Niteleyici: 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
- Genel Dize getName (): Sınıfın adını döndürür.
- genel Sınıf getSuperclass(): Süper sınıf referansını döndürür
- Genel Sınıf[] getInterfaces() : Belirtilen sınıf tarafından uygulanan arayüz dizisini döndürür
-
getModifiers'da herkese açık (): Belirtilen sınıfın değiştiricilerini temsil eden ve parametre olarak "" öğesine iletilmesi gereken bir tamsayı değeri döndürür.public static String toString (int i)” Verilen sınıf için erişim belirtecini döndüren yöntem.
Bir sınıf hakkında tam bilgi nasıl alınır?
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 Verileri Nasıl Alını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 tanımlayıcıları gibi meta verilerinin nasıl alınacağını göstermektedir.
Aşağıdaki Guru99Base.class adlı sınıfın meta verilerini alacağız:
import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { }
- Sınıfın adı: Guru99Base
- Erişim değiştiricileri şunlardır: genel ve soyut
- Arayüzleri uyguladı: Serileştirilebilir ve Klonlanabilir
- Herhangi bir sınıfı açıkça genişletmediğinden süper sınıftır: Java.lang.Object
Aşağıdaki sınıf Guru99Base.class'ın meta verilerini alacak ve yazdıracaktır:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main (String [] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Classguru99ClassObj = 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 in the form of Class array using getInterface() method class[] guru99InterfaceList = guru99classObj.getInterfaces(); // Print the implemented interfaces using foreach loop system.out.print("Implemented interfaces are : "); for (Class guru99class1 : quru99 InterfaceList) { system.out.print guru99class1.getName() + " "); } system.out.println(); //Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier class int guru99AccessModifier= guru99classObj.getModifiers(); // Print the access modifiers 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 süper sınıfın adını yazdırın
- Uygulanan arayüzlerin adını yazdırın
- Sınıf tarafından kullanılan erişim değiştiricileri yazdırın
Örnek 2: Değişkenin Meta Verileri Nasıl Alınır?
Aşağıdaki örnekler değişkenin meta verilerinin nasıl alınacağını göstermektedir:
Burada Guru99VariableMetaData .class adında bazı değişkenlerle bir sınıf oluşturuyoruz:
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ıfın sınıf nesnesini yani Guru99VariableMetaData.class'ı aşağıdaki gibi oluşturun:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Meta verileri kullanarak alan dizisi biçiminde alın getFields() or getDeclaredFields() aşağıdaki gibi yöntemler:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields() yöntem, genel değişkenin meta verilerini belirtilen sınıfın yanı sıra süper sınıfından da döndürür.
getDeclaredFields() yöntem yalnızca belirtilen sınıftaki tüm değişkenlerin meta verilerini döndürür.
- “public String getName()” yöntemini kullanarak değişkenlerin adını alın.
- “public Class getType()” yöntemini kullanarak değişkenlerin veri tipini alın.
-
“public xxx get (Field)” yöntemini kullanarak değişkenin değerini alın.
Burada xxx, getirmek istediğimiz herhangi bir değer türünün bir baytı veya kısası olabilir.
-
getModifier() ve Modifier.toString(int i) yöntemlerini kullanarak değişkenlerin erişim değiştiricilerini alın.
Burada Guru99VariableMetaData .class sınıfında bulunan değişkenlerin meta verilerini almak için bir sınıf yazıyoruz:
package guru; import java.lang.reflect.Field; 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 Guru99VariableMetaData Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields(); // Print name, datatypes, access modifiers and values of the varibales of the specified class for(Field field : guru99Field1) { System.out.println("Variable name : "+field.getName()); System.out.println("Datatypes of the variable :"+field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : "+field.get(guru99ClassVar)); System.out.println(); system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } }
- Guru99VariableMetaData.class için sınıf nesnesi oluşturuldu
- Bir Alan dizisindeki değişkenlerin tüm meta verilerini aldım
- Guru99VariableMetaData.class sınıfındaki tüm değişken adlarını yazdırdı
- Guru99VariableMetaData.class sınıfındaki değişkenlerin tüm veri türlerini yazdırdı
- Guru99VariableMetaData.class sınıfındaki değişkenlerin tüm erişim değiştiricilerini yazdırdı
- Tüm değişkenlerin yazdırılan değerleri Guru99VariableMetaData.class sınıfındaki değişkenlerin tüm veri türlerini yazdırdı
-
Yukarıdaki sınıfın sınıf nesnesini yani Guru99MethodMetaData.class'ı aşağıdaki gibi oluşturun:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Aşağıdaki gibi getMethods() ve getDeclaredMethods() yöntemini kullanarak bir Yöntem dizisindeki yöntem bilgilerini alın:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods() yöntem, genel yöntemlerin meta verilerini belirtilen sınıfın yanı sıra süper sınıfından da döndürür.
getDeclaredMethods() yöntem yalnızca belirtilen sınıftaki tüm yöntemlerin meta verilerini döndürür.
- Kullanarak yöntemin adını alın getName () yöntemi.
- Kullanarak yöntemin dönüş türünü alın getReturnType() yöntemi.
- Kullanarak yöntemlerin erişim değiştiricilerini alın getModifiers() ve Modifiers.toString(int i) yöntemleri.
- Kullanarak yöntem parametre türlerini alın getParameterTypes() Bir sınıf dizisi döndüren yöntem.
-
Kullanarak atılan istisnayı alın getExceptionTypes() Bir sınıf dizisi döndüren yöntem.
- Guru99MethodMetaData.class için sınıf nesnesi oluşturuldu
- Bir Yöntem dizisindeki tüm yöntemlerin tüm meta verilerini aldım
- Guru99MethodMetaData.class sınıfında bulunan tüm yöntem adlarını yazdırdı
- Guru99MethodMetaData.class sınıfındaki yöntemlerin yazdırılan dönüş türleri
- Guru99MethodMetaData.class sınıfındaki yöntemlerin tüm erişim değiştiricilerini yazdırdı
- Guru99MethodMetaData.class'taki yöntemlerin yazdırılan parametre türleri
-
Basılı istisnalar Guru99MethodMetaData.class'taki yöntemler tarafından oluşturulur.
- Guru99Constructor.class için sınıf nesnesi oluşturuldu
- Bir Yapıcı dizisindeki tüm yapıcıların tüm meta verilerini aldım
- Guru99Constructor.class sınıfında bulunan tüm kurucuların adları yazdırıldı
- Guru99Constructor.class sınıfındaki yapıcıların tüm erişim değiştiricilerini yazdırdı
- Guru99Constructor.class'taki yapıcıların yazdırılan parametre türleri
- Basılı istisnalar Guru99Constructor.class'taki yapıcılar tarafından oluşturulur.
- Java'daki yansıma programlama, Sınıflar ve Sınıf üyeleri hakkında değişkenler, yöntemler, yapıcılar gibi bilgilerin alınmasına ve değiştirilmesine yardımcı olur.
- Yansıma API'si Java java.lang.reflect paketindeki sınıflar ve java.lang.Class sınıfının metodları kullanılarak uygulanabilir.
- Java.lang.Class sınıfının yaygın olarak kullanılan bazı yöntemleri getName (), getSuperclass (), getInterfaces (), getModifiers () vb.'dir.
- Java.lang.reflect paketinde yaygın olarak kullanılan bazı sınıflar Field, Method, Constructor, Modifier vb.'dir.
- Reflection API, bir sınıfın güvenlik tehdidi olabilecek özel yöntemlerine ve değişkenlerine erişebilir.
- Reflection API, aşağıdakiler tarafından sağlanan güçlü bir özelliktir: Java, ancak daha yavaş performans, güvenlik açığı ve izin sorunu gibi bazı ek yüklerle birlikte gelir. Bu nedenle, yansıma API'si bir işlemi gerçekleştirmenin son çaresi olarak ele alınmalıdır.
Örnek 3 : Yöntemin Meta Verileri Nasıl Alınır?
Aşağıdaki örnekler bir metodun meta verilerinin nasıl alınacağını göstermektedir:
Burada Guru99MethodMetaData .class adında bazı metodlarla bir sınıf oluşturuyoruz.
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 Reflextion 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 yöntemlere ilişkin meta verileri alma adımları:
Burada Guru99MethodMetaData.class sınıfında mevcut olan yöntemlerin meta verilerini almak için bir sınıf yazıyoruz:
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 Guru99Method MetaData.class class guru99ClassObj = Guru99MethodMetaData.class; // Get the metadata or information of all the methods of the class using getDeclaredMethods() Method[] guru99Methods=guru99classObj.getDeclaredMethods(); for(Method method : guru99Methods) { // Print the method names System.out.println("Name of the method : "+method.getName()); // Print return type of the methods System.out.println("Return type of the method : "+method.getReturnType()); //Get the access modifier list and print int guru99ModifierList = method.getModifiers(); System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList)); // Get and print parameters of the methods Class[] guru99ParamList= method.getParameterTypes(); system.out.print ("Method parameter types : "); for (Class class1 : guru99ParamList){ System.out.println(class1.getName()+" "); } System.out.println(); // Get and print exception thrown by the method Class[] guru99ExceptionList = method. getExceptionTypes(); system.out.print("Excpetion thrown by method :"); for (Class class1 : guru99ExceptionList) { System.out.println (class1.getName() +" "): } System.Out.println(); system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "); } } }
Örnek 4 : Yapıcıların Meta Verileri Nasıl Alınır?
Aşağıdaki örnekler, oluşturucuların meta verilerinin nasıl alınacağını göstermektedir:
Burada farklı yapıcılarla Guru99Constructor.class adında bir sınıf oluşturuyoruz:
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 Guru99Constructor.class sınıfında bulunan yapıcıların meta verilerini almak için bir sınıf yazıyoruz:
package guru; import java.lang.reflect.Constructor; 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) { // Print all name of each constructor System.out.println("Constrcutor name : "+constructor.getName()); //Get and print access modifiers of each constructor int guru99Modifiers= constructor.getModifiers(); System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers)); // Get and print parameter types Class[] guru99ParamList=constructor.getParameterTypes(); System.out.print ("Constrctor parameter types :"); for (Class class1 : guru99ParamList) { System.out.println(class1.getName() +" "); } System. out.println(); // Get and print exception thrown by constructors Class[] guru99ExceptionList=constructor.getFxceptionTypes(); System.out.println("Exception thrown by constructors :"); for (Class class1 : guru99ExceptionList) { System.out.println(class1.getName() +" "); } System.out.println(); System.out.println("*******************************************"); } } }