Örnekli Java Reflection API Eğitimi

İçindekiler:

Anonim

Java'da Yansıma nedir?

Java Yansıması, çalışma zamanında bir sınıfın tüm yeteneklerini analiz etme ve değiştirme sürecidir. Java'daki Reflection API, çalışma zamanında alanlar, yöntemler, yapıcı vb. İçeren sınıfı ve üyelerini işlemek için kullanılır.

Java'da yansıma API'sinin bir avantajı, sınıfın özel üyelerini de değiştirebilmesidir.

Java.lang.reflect paketi, yansıma java'yı 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.

Bu eğitimde öğreneceksiniz-

  • Yansıma nedir
  • Java.lang.reflect Paketi Sınıfı
  • Java.lang.Class'da kullanılan yöntemler
  • Bir sınıf hakkında eksiksiz bilgi nasıl alınır
  • Örnek 1: Sınıfın Meta Verisi Nasıl Elde Edilir
  • Örnek 2: Değişkenin Meta Verilerini Alma
  • Örnek 3: Metodun Meta Verisi Nasıl Elde Edilir
  • Örnek 4: Oluşturucuların Meta Verilerini Alma

Java.lang.reflect Paketi Sınıfı

Aşağıda, yansıma uygulamak için java.lang.package'deki çeşitli Java sınıflarının bir listesi bulunmaktadır.

  • Alan : Bu sınıf, bir değişkenin veri türü, erişim değiştiricisi, adı ve değeri gibi bildirime dayalı 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 bildirime dayalı bilgileri toplamak için kullanılır.
  • Yapıcı : Bu sınıf, bir yapıcının erişim değiştiricisi, adı ve parametre türleri gibi bildirime dayalı bilgileri toplamak için kullanılır.
  • Değiştirici : Bu sınıf, belirli bir erişim değiştiricisi hakkında bilgi toplamak için kullanılır.

Java.lang.Class'da kullanılan yöntemler

  • Public String getName () : Sınıfın adını döndürür.
  • public Class getSuperclass () : Süper sınıf referansını verir
  • Genel Sınıf [] getInterfaces () : Belirtilen sınıf tarafından uygulanan bir arabirim dizisi döndürür
  • GetModifiers () 'da genel: Belirtilen sınıf için erişim belirtecini döndüren " public static String toString (int i)" yöntemine parametre olarak iletilmesi gereken, belirtilen sınıfın değiştiricilerini temsil eden bir tamsayı değeri döndürür.

Bir sınıf hakkında eksiksiz bilgi nasıl alınır

Bir sınıfın değişkenleri, yöntemleri ve yapıcıları hakkında bilgi almak için, sınıfın bir nesnesini oluşturmamız gerekir.
public class Guru99ClassObjectCreation {public static void main (String[] args) throws ClassNotFoundException {//1 - By using Class.forname() methodClass c1 = Class.forName("Guru99ClassObjectCreation");//2- By using getClass() methodGuru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();Class c2 = guru99Obj.getClass();//3- By using .classClass c3= Guru99ClassObjectCreation.class;}}
  • Aşağıdaki örnek, "sınıf" sınıfının nesnesini oluşturmanın farklı yollarını gösterir:
  • Örnek 1: Sınıfın Meta Verisi Nasıl Elde Edilir

    Aşağıdaki örnek, sınıf adı, süper sınıf adı, uygulanan arabirimler ve bir sınıfın erişim değiştiricileri gibi meta verilerin nasıl alınacağını gösterir.

    Guru99Base.class adlı aşağıdaki sınıfın meta verilerini alacağız:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Sınıfın adı: Guru99Base
    2. Erişim değiştiricileri şunlardır: genel ve soyut
    3. Arayüzleri uyguladı: Serileştirilebilir ve Klonlanabilir
    4. Herhangi bir sınıfı açıkça genişletmediğinden, süper sınıfı: 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.classClass  guru99ClassObj = Guru99Base.class;// Print name of the classsystem.out.println("Name of the class is : " +guru99ClassObj.getName());// Print Super class namesystem.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() methodclass[] guru99InterfaceList = guru99classObj.getInterfaces();// Print the implemented interfaces using foreach loopsystem.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 classint guru99AccessModifier= guru99classObj.getModifiers();// Print the access modifiersSystem.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));}} 
    1. getName yöntemini kullanarak sınıfın adını yazdırın
    2. GetSuperClass (). GetName () yöntemini kullanarak süper sınıfın adını yazdırın
    3. Uygulanan arayüzlerin adını yazdırın
    4. Sınıf tarafından kullanılan erişim değiştiricilerini yazdırın

    Örnek 2: Değişkenin Meta Verisi Nasıl Elde Edilir

    Aşağıdaki örnekler, değişkenin meta verilerinin nasıl alınacağını gösterir:

    Burada, bazı değişkenlerle Guru99VariableMetaData .class adında 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ıftaki değişkenler hakkında meta verileri alma adımları:
    1. 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();
    2. Kullanılarak alan dizisi biçiminde meta al getFields () ya da getDeclaredFields () aşağıdaki gibi yöntem:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields () yöntemi, belirtilen sınıftan ve süper sınıfından public değişkeninin meta verilerini döndürür.

    getDeclaredFields () yöntemi, yalnızca belirtilen sınıftaki tüm değişkenlerin meta verilerini döndürür.

    1. "Public String getName ()" yöntemini kullanarak değişkenlerin adını alın.
    2. "Public Class getType ()" yöntemini kullanarak değişkenlerin veri türünü alın.
    3. "Public xxx get (Field)" yöntemini kullanarak değişkenin değerini alın.

      Burada, xxx bir bayt olabilir veya getirmek istediğimiz herhangi bir değer türünün kısa olabilir.

    4. 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.classGuru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();// Get the metadata of all the fields of the class Guru99VariableMetaDataField[] guru99Field1= guru99ClassObjVar.getDeclaredFields();// Print name, datatypes, access modifiers and values of the varibales of the specified classfor(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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
      1. Guru99VariableMetaData.class için sınıf nesnesi oluşturuldu
      2. Bir Alan dizisindeki değişkenlerin tüm meta verilerini aldım
      3. Guru99VariableMetaData.class sınıfındaki tüm değişken adlarını yazdırdı
      4. Guru99VariableMetaData.class sınıfındaki değişkenlerin tüm veri türlerini yazdırdı
      5. Guru99VariableMetaData.class sınıfındaki değişkenlerin tüm erişim değiştiricilerini yazdırdı
      6. Tüm değişkenlerin basılı değerleri Guru99VariableMetaData.class sınıfındaki değişkenlerin tüm veri türlerini yazdırdı

      Örnek 3: Metodun Meta Verisi Nasıl Alınır

      Aşağıdaki örnekler, bir yöntemin meta verilerinin nasıl alınacağını gösterir:

      Burada bazı yöntemler ile Guru99MethodMetaData .class adında 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öntemler hakkında meta verileri alma adımları:

      1. 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();
      2. Aşağıdaki gibi getMethods () ve getDeclaredMethods () yöntemini kullanarak bir Method dizisindeki yöntem bilgilerini alın:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods () yöntemi, belirtilen sınıftan ve süper sınıfından genel yöntemlerin meta verilerini döndürür.

        getDeclaredMethods () yöntemi, yalnızca belirtilen sınıftaki tüm yöntemlerin meta verilerini döndürür.

      3. GetName () yöntemini kullanarak yöntemin adını alın .
      4. GetReturnType () yöntemini kullanarak yöntemin dönüş türünü alın .
      5. GetModifiers () ve Modifiers.toString (int i) yöntemlerini kullanarak yöntemlerin erişim değiştiricilerini alın .
      6. Bir sınıf dizisi döndüren getParameterTypes () yöntemini kullanarak yöntem parametre türlerini alın .
      7. Bir sınıf dizisi döndüren getExceptionTypes () yöntemini kullanarak atılan istisna alın .

      Burada, Guru99MethodMetaData.class sınıfında bulunan 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.classclass 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 namesSystem.out.println("Name of the method : "+method.getName());// Print return type of the methodsSystem.out.println("Return type of the method : "+method.getReturnType());//Get the access modifier list and printint guru99ModifierList = method.getModifiers();System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));// Get and print parameters of the methodsClass[] 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 methodClass[] 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
      1. Guru99MethodMetaData.class için sınıf nesnesi oluşturuldu
      2. Bir Yöntem dizisindeki tüm yöntemlerin tüm meta verilerini aldım
      3. Guru99MethodMetaData.class sınıfında bulunan tüm yöntem adlarını yazdırdı
      4. Guru99MethodMetaData.class sınıfındaki yöntemlerin yazdırılmış dönüş türleri
      5. Guru99MethodMetaData.class sınıfındaki yöntemlerin tüm erişim değiştiricilerini yazdırdı
      6. Guru99MethodMetaData.class içindeki yöntemlerin yazdırılan parametre türleri
      7. Guru99MethodMetaData.class içindeki yöntemler tarafından yazdırılan istisnalar atılır

      Örnek 4: Oluşturucuların Meta Verilerini Alma

      Aşağıdaki örnekler, oluşturucuların meta verilerinin nasıl alınacağını gösterir:

      Burada, farklı kurucularla 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 kurucuları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.classClass guru99Class=Guru99Constructor.class;// Get all the constructor information in the Constructor arrayConstructor[] guru99ConstructorList = guru99Class.getConstructors();for (Constructor constructor : guru99ConstructorList) {// Print all name of each constructorSystem.out.println("Constrcutor name : "+constructor.getName());//Get and print access modifiers of each constructorint guru99Modifiers= constructor.getModifiers();System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));// Get and print parameter typesClass[] 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 constructorsClass[] 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("*******************************************");}}}
      1. Guru99Constructor.class için sınıf nesnesi oluşturuldu
      2. Bir Oluşturucu dizisindeki tüm kurucuların tüm meta verilerini aldı
      3. Guru99Constructor.class sınıfında bulunan tüm kurucu isimlerinin basımı
      4. Guru99Constructor.class sınıfındaki kurucuların tüm erişim değiştiricilerini yazdırdı
      5. Guru99Constructor.class içindeki yapıcıların yazdırılan parametre türleri
      6. Guru99Constructor.class içindeki yapıcılar tarafından yazdırılan istisnalar atılır

      Özet:

      • Java'da yansıma programlama, değişkenler, yöntemler, yapıcılar gibi Sınıflar ve Sınıf üyeleri hakkındaki bilgilerin alınmasına ve değiştirilmesine yardımcı olur.
      • Java'daki yansıma API'si, java.lang.reflect paketindeki sınıflar ve java.lang.Class sınıfının yöntemleri kullanılarak uygulanabilir.
      • Java.lang.Class sınıfının yaygın olarak kullanılan bazı yöntemleri şunlardır: getName (), getSuperclass (), getInterfaces (), getModifiers () vb.
      • Java.lang.reflect paketinde yaygın olarak kullanılan bazı sınıflar Alan, Yöntem, Oluşturucu, Değiştirici vb .'dir.
      • Reflection API, bir güvenlik tehdidi olabilecek özel yöntemlere ve bir sınıfın değişkenlerine erişebilir.
      • Reflection API, Java tarafından sağlanan güçlü bir özelliktir, 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ştirmek için son çare olarak ele alınmalıdır.