Java
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.
Örnek çözümü göster
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); }
});
}
}
Kendini test et
-
accept çağrısını tamamla
reader.____(visitor);
Cevabı göster
reader.accept(visitor);
-
ClassReader.accept ne yapar?
- Sınıfı derler
- Dosya siler
- Visitor'ı çağırır
- Thread başlatır
Cevabı göster
Visitor'ı çağırır — accept metodu visitor'ı sınıf ve metot olaylarıyla çağırır.
-
ClassReader öğelerini eşleştir
- accept
- Visitor'ı yönlendirir
- name
- Sınıf adı
- methods
- Metot listesi
- visitMethod
- Her metot için
Sıradaki ders: ClassVisitor