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.

  • 🔍 Tanım: Reflection, çalışma zamanında sınıfları ve üyelerini, hatta özel sınıfları bile inceler ve değiştirir.
  • ???? Reflect Paketi: Alan, Metot, Kurucu ve Değiştirici sınıfları, üyeler hakkında bildirimsel bilgiler toplar.
  • ???? ️ Sınıf Metotları: getName(), getSuperclass(), getInterfaces() ve getModifiers() yöntemleri temel sınıf meta verilerini döndürür.
  • 🧪 Çalışılan Örnekler: Dört program örneğitract, bir sınıfın, değişkenlerin, metotların ve kurucuların meta verileridir.
  • ⚠️ Dikkat: Reflection özel üyelere erişebildiği için daha yavaş çalışır, bu nedenle son çare olarak kullanın.

Java Yansıma API'si Eğitimi

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:

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

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:

Sınıfın Meta Verilerini Alın

import java.io.Serializable;
public abstract class Guru99Base implements Serializable, Cloneable {
}
  1. Sınıfın adı şudur: Guru99Temel
  2. Erişim değiştiricileri şunlardır: public ve abstract
  3. Arayüzleri uyguladı: Serileştirilebilir ve Klonlanabilir
  4. 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:

Sınıfın Meta Verilerini Alı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));
    }
}
  1. getName() yöntemini kullanarak sınıfın adını yazdırın.
  2. getSuperclass().getName() yöntemini kullanarak üst sınıfın adını yazdırın.
  3. Uygulanan arayüzlerin adlarını yazdırın.
  4. Sınıf tarafından kullanılan erişim değiştiricilerini yazdırın.

Sınıfın Meta Verilerini Alın

Sınıfın Meta Verilerini Alı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ı:

  1. 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();
  2. 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.

  1. “public String getName()” yöntemini kullanarak değişkenlerin adlarını alın.
  2. “public Class getType()” metodunu kullanarak değişkenlerin veri türünü alın.
  3. “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.
  4. 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:

Değişkenin Meta Verilerini Al

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();
        }
    }
}
  1. Bir sınıf nesnesi oluşturuldu. Guru99VariableMetaData.class.
  2. Bir Field dizisindeki değişkenlerin tüm meta verilerini aldım.
  3. Sınıftaki tüm değişken adlarını yazdırdı. Guru99VariableMetaData.class.
  4. Sınıftaki tüm değişkenlerin veri tiplerini yazdırdı.
  5. Sınıftaki tüm değişkenlerin erişim değiştiricilerini yazdırdı.
  6. Sınıftaki tüm değişkenlerin değerlerini yazdırdı.

Yöntemin Meta Verilerini Alma

Yöntemin Meta Verilerini Alma

Ö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:

Yöntemin Meta Verilerini Alma

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ı:

  1. 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();
  2. 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.

  3. Aşağıdaki yöntemi kullanarak metodun adını alın. getName () yöntemi.
  4. Metodun dönüş türünü aşağıdaki yöntemle elde edin. getReturnType() yöntemi.
  5. 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.
  6. Metot parametre türlerini aşağıdaki yöntemle elde edin. getParameterTypes() Bu yöntem, bir Sınıf dizisi döndürür.
  7. 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:

Yöntemin Meta Verilerini Alma

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();
        }
    }
}
  1. Bir sınıf nesnesi oluşturuldu. Guru99MethodMetaData.class.
  2. Tüm metotların meta verilerini bir Method dizisine aldım.
  3. Sınıfta bulunan tüm metot adlarını yazdırdı.
  4. Sınıftaki metotların dönüş tiplerini yazdırdı.
  5. Sınıftaki metotların tüm erişim değiştiricilerini yazdırdı.
  6. Metotların parametre türlerini yazdırdı.
  7. Metotların fırlattığı istisnaları yazdırdı.

Yöntemin Meta Verilerini Alma

Yöntemin Meta Verilerini Alma

Ö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:

Yapıcıların Meta Verilerini Alın

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:

Yapıcıların Meta Verilerini Alın

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();
        }
    }
}
  1. Bir sınıf nesnesi oluşturuldu. Guru99Constructor.class.
  2. Tüm yapıcı fonksiyonların meta verilerini bir Yapıcı fonksiyonlar dizisinde topladım.
  3. Sınıfta bulunan tüm kurucu fonksiyonların adlarını yazdırdı.
  4. Sınıftaki tüm kurucu metotların erişim değiştiricilerini yazdırdı.
  5. Yapıcı fonksiyonların parametre türlerini yazdırdı.
  6. Yapıcı fonksiyonlar tarafından fırlatılan istisnaları yazdırdı.

Yapıcıların Meta Verilerini Alın

Yapıcıların Meta Verilerini Alın

SSS

Yansıma (Reflection), çerçevelerin ve yapay zeka araçlarının çalışma zamanında sınıfları incelemesine ve örneklemesine olanak tanır. Bağımlılık enjeksiyonu, serileştirme ve ORM eşlemesi gibi işlevleri destekler.pingve derleme zamanında tam sınıfları bilmeden dinamik eklenti yükleme.

Yapay zeka, yansıma (reflection) kodunu hızla oluşturabilir, ancak bunu dikkatlice incelemelisiniz. Yansıma, erişim kontrollerini atlayabilir ve güvenlik ve performans riskleri oluşturabilir; bu nedenle oluşturulan kodun test edilmesi ve doğrulanması gerekir.

Yansıma (reflection) doğrudan metot çağrılarından daha yavaştır, özel üyelere erişerek kapsüllemeyi bozabilir ve güvenlik ve bakım sorunlarına neden olabilir. Sadece daha basit bir yaklaşım mevcut olmadığında kullanılmalıdır.

Evet. setAccessible(true) kullanarak, yansıma (reflection) özel alanları okuyabilir, değiştirebilir ve özel metotları çağırabilir. Bu, test ve çerçeveler için güçlüdür ancak kapsüllemeyi bozabilir ve güvenlik endişeleri yaratabilir.

Bu yazıyı şu şekilde özetleyin: