ClassReader
- Java kursu
- Uzman
- Ders 38/46
- 6 dk
ASM ClassReader ile sınıf okumayı yazarsın.
ClassReader ile gezi
ClassReader, sınıf yapısını gezip bir ClassVisitor'ı yönlendiren sınıftır. accept(ClassVisitor v) metodu önce visitClass'ı, sonra her metot için visitMethod'u çağırır. ASM'de ClassReader gerçek bayt kodunu ayrıştırır; biz ise ad ve metot listesini tutar.
Bu model, ASM'nin olay akışını yansıtır: ziyaret başı, her metot, ziyaret sonu. Visitor bu olayları yakalar ve istediğini yapar.
anonim visitor
Bir arabirimi uygulamak için yeni bir sınıf dosyası açmak zorunda değilsin. Anonim sınıf ile visitor'ı aynı yerde tanımlayabilirsin: new ClassVisitor() { ... }. Bu, tek kullanımlık uygulamalar için pratiktir.
Anonim sınıf, arabirimin tüm metotlarını uygulamalıdır. visitClass ve visitMethod içine System.out.println koyarak olayları ekrana yazdırabilirsin.
Uygulama ClassReader sınıfını ve accept metodunu yaz
Üstteki ClassVisitor arabirimine void visitMethod(String name); metodunu ekle. class ClassReader tanımla; String name ve String[] methods alanları ve ClassReader(String name, String[] methods) yapıcısı olsun. void accept(ClassVisitor v) metodu önce v.visitClass(name), sonra her metot için v.visitMethod(m) çağırsın. main içinde ClassReader reader = new ClassReader("Main", new String[]{"main"}); oluştur, anonim bir ClassVisitor ile reader.accept(...) çağır; visitor visitClass'ta System.out.println("Class: " + n);, visitMethod'ta System.out.println("Method: " + n); yapsın.
Başlangıç kodu
interface ClassVisitor {
void visitClass(String name);
}
public class Main {
public static void main(String[] args) {
System.out.println("inspector ready");
}
}Örnek çözüm
interface ClassVisitor {
void visitClass(String name);
void visitMethod(String name);
}
class ClassReader {
String name;
String[] methods;
ClassReader(String name, String[] methods) {
this.name = name;
this.methods = methods;
}
void accept(ClassVisitor v) {
v.visitClass(name);
for (String m : methods) v.visitMethod(m);
}
}
public class Main {
public static void main(String[] args) {
ClassReader reader = new ClassReader("Main", new String[]{"main"});
reader.accept(new ClassVisitor() {
public void visitClass(String n) { System.out.println("Class: " + n); }
public void visitMethod(String n) { System.out.println("Method: " + n); }
});
}
}Beklenen çıktı
Class: Main Method: main
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 accept çağrısını tamamla
reader.____(visitor);
reader.accept(visitor);
Açıklama: reader.accept(visitor) geziyi başlatır.
2 ClassReader.accept ne yapar?
- Sınıfı derler
- Dosya siler
- Visitor'ı çağırır Doğru cevap
- Thread başlatır
Açıklama: accept metodu visitor'ı sınıf ve metot olaylarıyla çağırır.
3 ClassReader öğelerini eşleştir
| Kavram | Anlamı |
|---|---|
accept |
Visitor'ı yönlendirir |
name |
Sınıf adı |
methods |
Metot listesi |
visitMethod |
Her metot için |