Makale Özeti

Reflectiona Genel Bakış

Makale

Reflection-1 ( Reflectiona Genel Bakış)

Reflection-1

Reflectiona Genel Bakış

Reflection, çalışma zamanında tür bilgisini elde etmemizi sağlar. Tür bilgisi; sınıfın içinde, alanları ve metodları kapsar. Reflection uygulaması geliştirmek için Reflection isim uzayını kullanırız.

System.Reflection isim uzayı türler ,metodlar ve alanlar üzerinde yönetilebilen bir ortam sağlamakla birlikte , yönetilen kod tarafında yüklenen nesnelerin türlerini, metodlarını ve alanlarını dinamik olarak oluşturmayı ve türleri çağırmayı sağlayan sınıflar ve arayüzler içerir.System.Reflection namespacesi birçok sınıf içerir. 130 ün üstünde sınıf ve arayüzü vardır Bu sınıflar sayesinde programcı uygulaması hakkında bilgi alabilir.

Reflectionu anlamak adına ilk önce Metadata ve assembly kavramlarından başlayarak, ilişkili olduğu attribute, latebinding, serialization ile ilgili olan kısımlarından bahsedip ufak uygulamalar yapacağız.

Metadate – Assembly

Assemly için daha önceden; programın kendi kendisini tanımlamasını sağlayan, .net uygulamalarının temel yapı bloğudur demiştik. Temel yapı bloğu olma özelliğine de MSIL kodu içermesi sayesinde sahip oluyor. (.net altında hangi dilde program yazarsak yazalım, MSIL(Microsoft Intermediate Language) aradiline çevrilir. Assembly içinde sadece MSIL değil metadata bilgileride bulunur. metadata assemblyyi oluşturan dosyaları belirtir ve assemblyyi tanıtan bilgiyi sağlar. .net taşınması zor, programı tanımlayıcı bilgileri programın içine otomatik olarak yerleştirilir . metada sayesinde programı tanımlayıcı bilgiler programın üzerinde taşınır. Bu da programın dağıtılması açısından çok esnek bir yapı sağlar.

Program kodu içinde yönetilen ve yönetilmeyen kod vardır. Yönetilen kodun çalışma zamanında metadata ile ayarlamaları yapılabilir. Eğer metadataya ulaşamıyorsak, yönetilen koda da ulaşamıyoruz demektir. System.Reflection isim uzayı çalışma zamanında çalışan programın metadatasına ulaşmamızı sağlıyor.

AppDomain bizim uygulamamıza bir izalosyon sağlıyordu. AppDomain birçok assemby içerir. Assembly tür ve değerler içerir. Türlerin elde edilmesi için Assemblynin sorgulanması gerekir. System.Reflection namespacesi kullanılarak, dinamik olarak oluşturulan assemblynin içeriğinde bütün bu türler ve değerler hakkındaki bilgiyi elde edebilliriz.

Nasıl AppDomain çalışma zamanında Threadler için bir ortam sağlıyorsa, Assemblyde uygulama içindeki bütün verilerin türlerinin bulunduğu bir paket sağlar.

Şekil-1: Programımızın akışında Assemblynin yeri.

 

Reflectionı Nerede Kullanacağım?

Sorusuna gelince: Bir çok yerde.

Genel olarak bakarsak reflection şu alanlarda kullanılır:

  • Nesnenin sınıfını tanımlamada.
  • Temel sınıf hakkında bilgi elde etmek için.
  • Sınıftaki alanlar, metodlar ve yapı hakkında bilgi edinmek için.
  • Çalışma zamanında dinamik olarak sınıf oluşturmada.
  • Çalışma zamanında dinamik olarak oluşturulan türler hakkında bilgi almayı sağlar.
  • Programın içinde çalışma zamanında adı bilinmeyen herhangi bir alanın üzerinde istediğimiz değişiklikleri yapmak için.
  • Çalışma zamanında detayları bilinmeyen bir metod çağırmada.
  • Uygulamanın çalışması sırasında dinamik olarak değer veya nesne ekleme imkanı sağlar.
  • Attribute işlemlerin programlanmasını sağlıyor.
  • Emit sınıfını kullanarak .net assemblysi oluşturmayı sağlar.
  • Kendi oluşturduğumuz attributeü kullanarak oluşturduğumuz programın davranışlarını kontrol edebiliriz. Kendi yaptığımız Attributesi kullanarak, reflection aracılığı ile programın çalışması sırasında dinamik olarak kod üretebiliriz.
  • Serialization, CLR ve .net Framework tarafından sağlanan Reflectionı kullanarak verilerin serialize edilmesini sağlar.
  • Farklı assemblyler içindeki kaynağa ulaşmamız gerekebilir. Bunun için ilk önce kaynağı içeren assemblyyi yükleriz. Assemblyyi yüklemek için System.Reflection sınıfını kullanabiliriz. Aynı şekilde; elimizdeki bilgileri kullaranak assemblynin bir örneğini oluşturabiliriz.
  • Karmaşık bir programlama modeli içinde kullandığımız araçların ne işe yaradıklarını öğrenebiliriz. Herhangi bir nesnenin desteklediği metodları, özellikleri, yapısını, alanlarını, olaylarını ve diğer üyelerini System.Reflection namespacesi ile öğrenebiliriz.


Aslında biz reflectiona o kadar da yabancı değiliz. Reflection; derleme, decompiler, debugger, class browser, yorumlama ve object inspector gibi bir çok programlama araçlarında kullanılır. Aynı şekilde, intellisence ve classview reflectionı büyük ölçüde kullanır. CLR(Comman Language Runtime) ve .net Frameworkte serialization yaparken, remoting mimarisinde, dinamik dağıtık metodlar gibi bir çok önemli özellikte reflection kullanılır.

Reflection, alanlar, metodlar, yapılar, attributeler, sınıflar, interfaceler gibi elemanları analiz etmemizi sağlar. Bu bilgileri elde ettikten sonra ildasm aracılığı ile görebilir (Ildasm, .net nesnelerini yükleyerek, MSIL kodunu ve diğer bilgileri bize göstermektedir.) veya elde ettiğimiz bilgileri çalışma zamanında, dinamik olarak çağırarak kullanabiliriz.

Bundan sonraki makalede (Reflection - 2) reflection isim uzayının etrafında döndüğü System.Type sınıfını inceleyerek, bir uygulama yapacağız.


Öznur KARAKUŞOĞLU
oznurkarakusoglu@hotmail.com