Özet - Reflection
- Java kursu
- İleri seviye
- Ders 30/82
- 5 dk
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.
Başlangıç kodu
import java.lang.reflect.Method;
// Class.forName ile String sınıfını bul
// getMethods ile tüm yöntemleri al
// for ile gez, length varsa true yazdırÖrnek çözüm
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);
}
}Beklenen çıktı
true
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.
Başlangıç kodu
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
// Book sınıfını tanımla (title, kurucu, describe)
// getDeclaredConstructor + newInstance ile örneği al
// getMethod + invoke ile describe çağır, yazdırÖrnek çözüm
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));
}
}Beklenen çıktı
Book: Java
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangi yöntem bir Class nesnesini çalışma anında yöntem çağırmak için kullanılır?
- newInstance
- invoke Doğru cevap
- getMethod
- forName
Açıklama: invoke bir Method nesnesini çağırır.
2 Yöntemi davranışla eşleştir
| Kavram | Anlamı |
|---|---|
Class.forName |
İsimle sınıf bul |
getMethods |
Yöntemleri listele |
invoke |
Yöntemi çağır |
newInstance |
Örnek oluştur |