Java
ClassVisitor
ClassVisitor ile metod ve alan tarama yazarsın.
ClassVisitor uygulaması
ClassVisitor bir arabirim olduğundan, onu uygulayan somut sınıflar olayları yakalar. ClassWriter bunlardan biridir: ziyaret olaylarını bir StringBuilder'da toplar ve toString ile metin çıktı verir. Bu, ASM'deki yazıcı (writer) rolüne karşılık gelir.
Bir sınıf arabirimi uygulamak için implements anahtar sözcüğü kullanılır ve tüm metotlar yazılır. Böylece visitor, gezinin çıktısını üretir.
StringBuilder ile toplama
StringBuilder, metin parçalarını verimli biçimde birleştiren sınıftır. append metoduyla zincirleme ekleme yapılır: sb.append("Class: ").append(n).append("\n"); gibi. Her ekleme aynı nesneyi döndürdüğü için arka arkaya yazılır.
ClassWriter her ziyaret olayında sb.append(...) yapar. Gezi bitince toString çağrılır ve biriken metin döner. trim ile sondaki boş satır da kesilir; böylece çıktı düzgün görünür.
Uygulama ClassWriter sınıfını yaz
Üstteki yapıya class ClassWriter implements ClassVisitor ekle; StringBuilder sb = new StringBuilder(); alanı olsun. visitClass(String n) metodu sb.append("Class: ").append(n).append("\n");, visitMethod(String n) metodu sb.append("Method: ").append(n).append("\n"); yapsın. String toString() metodu sb.toString().trim() döndürsün. main içinde ClassReader reader = new ClassReader("Main", new String[]{"main"}); ve ClassWriter writer = new ClassWriter(); oluştur, reader.accept(writer); çağır ve System.out.println(writer.toString()); ile yazdır.
Ö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);
}
}
class ClassWriter implements ClassVisitor {
StringBuilder sb = new StringBuilder();
public void visitClass(String n) { sb.append("Class: ").append(n).append("\n"); }
public void visitMethod(String n) { sb.append("Method: ").append(n).append("\n"); }
public String toString() { return sb.toString().trim(); }
}
public class Main {
public static void main(String[] args) {
ClassReader reader = new ClassReader("Main", new String[]{"main"});
ClassWriter writer = new ClassWriter();
reader.accept(writer);
System.out.println(writer.toString());
}
}
Kendini test et
-
ClassWriter'ın görevi nedir?
- Sınıfı derler
- Thread yönetir
- Çöp toplar
- Ziyaret olaylarını metne çevirir
Cevabı göster
Ziyaret olaylarını metne çevirir — ClassWriter olayları StringBuilder'da toplar.
-
implements bildirimini tamamla
class ClassWriter ____ ClassVisitor {}
Cevabı göster
class ClassWriter implements ClassVisitor {}
-
ClassWriter öğelerini eşleştir
- implements
- Arabirim uygulama
- StringBuilder
- Metin birleştirme
- append
- Zincirleme ekleme
- toString
- Metni döndürme
Sıradaki ders: Bytecode dönüştürme