Java
Özet - Reflection
getMethods ve invoke'u birleştirerek bir nesne inceleyici yazarsın.
Özet - Reflection
Bu grupta reflection'ın temel araçlarını gördün. Class<?> tür bilgisi verir; getFields ve getMethods public üyeleri listeler; invoke yöntemleri çağırır; getDeclaredConstructors ile newInstance yeni örnekler üretir.
Bu araçları birleştirerek çerçeveler, kütüphaneler ve test araçları çalışma anında herhangi bir sınıfı inceleyip kullanabilir. Örneğin Class.forName ile sınıfı bul, getDeclaredConstructor ile kurucuyu al, newInstance ile örnek oluştur ve invoke ile yöntem çağır.
Uygulama Bir yöntem var mı denetle
Class.forName("java.lang.String") ile String sınıfını bul. getMethods() ile tüm yöntemleri al. Bir for döngüsü ile yöntemleri gez; length adında bir yöntem varsa true yazdır. main imzasına throws ClassNotFoundException ekle.
Örnek çözümü göster
import java.lang.reflect.Method;
public class MethodList {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> c = Class.forName("java.lang.String");
Method[] methods = c.getMethods();
boolean hasLength = false;
for (Method m : methods) {
if (m.getName().equals("length")) {
hasLength = true;
break;
}
}
System.out.println(hasLength);
}
}
Reflection ne zaman kullanılır?
Reflection, çalışma anında tür bilgisi gerektiğinde kullanılır. Çerçeveler, kütüphaneler ve test araçları bununla sınıfları keşfeder; bağımlılık enjeksiyonu, serileştirme ve annotation işleme reflection'a dayanır.
Ancak reflection'ın bir bedeli vardır: derleme zamanı denetimi kaybolur, performans düşer ve kapsülleme bozulabilir. Bu yüzden sıradan uygulama kodunda kaçınılmalı; yalnızca gerçekten gerekli olduğunda kullanılmalıdır. Alternatif olarak arayüz ve polimorfizm çoğu durumda daha temizdir.
Uygulama Constructor + newInstance + invoke zinciri
Bir Book sınıfı tanımla; public String title alanı, public Book(String title) kurucusu ve public String describe() yöntemi olsun; describe "Book: " + title döndürsün. getDeclaredConstructor(String.class).newInstance("Java") ile örnek oluştur. getMethod("describe").invoke(b) ile yöntemi çağır ve sonucu System.out.println ile yazdır. main imzasına throws Exception ekle.
Örnek çözümü göster
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
class Book {
public String title;
public Book(String title) {
this.title = title;
}
public String describe() {
return "Book: " + title;
}
}
public class FullReflection {
public static void main(String[] args) throws Exception {
Book b = Book.class.getDeclaredConstructor(String.class).newInstance("Java");
Method m = Book.class.getMethod("describe");
System.out.println(m.invoke(b));
}
}
Kendini test et
-
Hangi yöntem bir Class nesnesini çalışma anında yöntem çağırmak için kullanılır?
- newInstance
- invoke
- getMethod
- forName
Cevabı göster
invoke — invoke bir Method nesnesini çağırır.
-
Yöntemi davranışla eşleştir
- Class.forName
- İsimle sınıf bul
- getMethods
- Yöntemleri listele
- invoke
- Yöntemi çağır
- newInstance
- Örnek oluştur
Sıradaki ders: Yerleşik annotation'lar