Java Reflection ile Object Class Kavramları

Batuhan Düzgün tarafından yayınlanmıştır 13. October 2012 06:46

Merhaba arkadaşlar bu yazıda sizlerle birlikte Java’da Reflection kullanımını inceleyeceğim. Özellikle Class ve Object kavramlarının Reflection içinde nasıl kullanılabileceğine dair örnekler verilecektir.

 

Reflection Nedir?

Kısaca çalışma zamanında, tanımlanmış olan sınıflardan nesne örnekleri oluşturulması anlamına gelmektedir. İlk adım olarak nesnenin hangi sınıfa ait  olduğunu bulmak olur. Ardından nesne yaratılması için gereken sınıf (Class) yapısı alınır. Daha sonra alınan sınıf yapısından Reflection kütüphanesi yardımıyla yeni nesneler çalışma zamanında oluşturulur. Ayrıca, sınıf içinde yer alan fieldlara, metodlara ve birçok özelliğe erişebilmeyi sağlar.

 

Java ‘da Reflection …

Eclipse IDE ile boş bir Java projesi açılır. Ardından “main” metodu içeren “TestUnit” adında bir sınıf açılır. Aşağıdaki kodlar açıklamalarıyla birlikte verilmiştir.

public class TestUnit {

       public static void main(String[] args) {

            

       }

} 

Reflect edilmesi planlanan “Shape” adında bir sınıf hazırlanır. Aşağıdaki gibi basit anlamda bir sınıf yapısı yazılmıştır. “Shape” sınıfına ait nesneler çalışma zamanında oluşturulacaktır.

package reflection;

// Shape sınıfında Shape adı, Shape alanı, Shape çevresi gibi fieldlar bulunmaktadır.

public class Shape {

       // Shape ismi

       private String shapeName;

       // Shape alanı

       private double shapeSpace;

       // Shape çevresi

       private double shapeRectangle;

      

       // Shape kurucusu

       public Shape() {

             this.setShapeName("");

             this.setShapeRectangle(0);

             this.setShapeSpace(0);

       }

       // Shape parametreli kurucu

       public Shape(String shapename) {

             super();

             this.setShapeName(shapename);

       }

 

       /*

        * getter ve setter metodları

        */

       public String getShapeName() {

             return shapeName;

       }

       public void setShapeName(String shapeName) {

             this.shapeName = shapeName;

       }

       public double getShapeSpace() {

             return shapeSpace;

       }

       public void setShapeSpace(double shapeSpace) {

             this.shapeSpace = shapeSpace;

       }

       public double getShapeRectangle() {

             return shapeRectangle;

       }

       public void setShapeRectangle(double shapeRectangle) {

             this.shapeRectangle = shapeRectangle;

       }

} 

İlk örnekte Class ve Object kavramlarının Reflectionda neleri temsil ettiğinden bahsedeceğim.

Class :  Yazılım Mühendisi veya Programcı tarafından hazırlanmış olan veri yapısının bir taslağını veya planını ifade etmektedir. Sınıf içinde String, Double tipte değişken tanımlamak, parametreli parametresiz metodlar yazmak ve bir çok özellik sınıfa ait yapıyı ve planı ifade eder.

Object (Nesne) : Yukarıda belirtildiği gibi hazırlanmış olan sınıf yapısına uygun, bilgisayar belleğinde yer tutan örneklerinin oluşturulmuş haline nesne denilmektedir. Nesneler sınıf ile hazırlanmış olan planın veya taslağın vücud bulmuş halidir. Mimarın çizdiği taslağa uygun birden fazla bina yapılması gibidir. Taslak aynıdır ve o taslaktan birden fazla örnek oluşturulmuştur.

public class TestUnit {

       public static void main(String[] args) {

             try {

                    // Class ismi verilerek yeni bir Class oluşturulur.

                    // Class ve Object aslında iki önemli parçadır.

                    // Object, hazırlanmış olan Class yapısının, bilgisayar belleğinde belli bir yer kapladığı alanı temsil eder.

                    // Object veya herhangi bir nesne yaratıldığında bellekte belli bir alan kaplar.

                    // Class ise nesnenin oluşturulması için hazırlanmış olan şablon veya plandır.

                    // Alttaki satırda hazırlanmış olan "Shape" planından bir adet alınır.

                    Class<?> shapeClass = Class.forName("reflection.Shape");

                    // Alınan "Shape" sınıfından parametreli kurucu metod çağırılır.

                    // Dikkat edilirse, String tipinde parametre alındığını belirtmek için "Strin.class" parametrenin tipi verilmiştir.

                    Constructor<?> newShape = shapeClass.getConstructor(String.class);

                    // Alınan kurucu metod üzerinden yeni bir nesne örneği yaratılır.

                    // Alınmış olan Class tanımına göre bir nesne Reflection yöntemiyle elde edilmiş oldu.

                    Object obj = newShape.newInstance("Batuhan");

                    // "Batuhan" değerinde bir String ifade verilmişti.

                    // Console ekranına nesnenin yaratıldığını göstermek için aşağıdaki gibi isim alanı ekrana yazdırılır.

                    System.out.println(((Shape)obj).getShapeName());

             } catch (ClassNotFoundException e) {

                    e.printStackTrace();

             } catch (SecurityException e) {

                    e.printStackTrace();

             } catch (NoSuchMethodException e) {

                    e.printStackTrace();

             } catch (IllegalArgumentException e) {

                    e.printStackTrace();

             } catch (InstantiationException e) {

                    e.printStackTrace();

             } catch (IllegalAccessException e) {

                    e.printStackTrace();

             } catch (InvocationTargetException e) {

                    e.printStackTrace();

             }

       }

} 

İkinci örnekte, alınan Class yapısında yer alan ve tanımlanmış kurucu metodlar, değişkenler  ve metodlar listelenecektir.

public static void main(String[] args) {

             try {

                    // Class ismi verilerek yeni bir Class oluşturulur.

                    // Class ve Object aslında iki önemli parçadır.

                    // Object, hazırlanmış olan Class yapısının, bilgisayar belleğinde belli bir yer kapladığı alanı temsil eder.

                    // Object veya herhangi bir nesne yaratıldığında bellekte belli bir alan kaplar.

                    // Class ise nesnenin oluşturulması için hazırlanmış olan şablon veya plandır.

                    // Alttaki satırda hazırlanmış olan "Shape" planından bir adet alınır.

                    Class<?> shapeClass = Class.forName("reflection.Shape");

                    System.out.println("Shape sınıfında yer alan kurucu metodlar : ");

                    Constructor<?>[] construstors = shapeClass.getDeclaredConstructors();

                    for (int i = 0; i < construstors.length; i++) {

                           Constructor<?> constructor = construstors[i];

                           System.out.println(constructor.getName());

                    }

                    System.out.println("Shape sınıfında yer alan değişkenler : ");

                    Field[] fields = shapeClass.getDeclaredFields();

                    for (int i = 0; i < fields.length; i++) {

                           Field field = fields[i];

                           System.out.println(field.getName());

                    }

                    System.out.println("Shape sınıfında yer alan metodlar : ");

                    Method[] methods = shapeClass.getDeclaredMethods();

                    for (int i = 0; i < methods.length; i++) {

                           Method method = methods[i];

                           System.out.println(method.getName());

                    }

             } catch (SecurityException e) {

                    e.printStackTrace();

             } catch (ClassNotFoundException e) {

                    e.printStackTrace();

             }

       } 

Reflection kullanıma dair  bu yazıda bahsedeceklerim şimdilik bu kadar. Bir sonraki makalemde görüşmek dileğiyle…

 

Batuhan Düzgün

Bilgisayar Mühendisi

Endüstri Mühendisi

Currently rated 3.0 by 1 people

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

Java

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  November 2018  >>
MoTuWeThFrSaSu
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

Yazıları geniş takvimde göster