CodeBlanks Logo Icon CodeBlanks

ClassReader

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

Main.java
interface ClassVisitor {
    void visitClass(String name);
}

public class Main {
    public static void main(String[] args) {
        System.out.println("inspector ready");
    }
}

Örnek çözüm

Main.java
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

Soru
reader.____(visitor);
Cevap
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

Uzman bölümündeki tüm dersler