ClassVisitor
- Java kursu
- Uzman
- Ders 39/46
- 6 dk
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.
Başlangıç kodu
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); }
});
}
}Ö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);
}
}
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());
}
}Beklenen çıktı
Class: Main Method: main
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 ClassWriter'ın görevi nedir?
- Sınıfı derler
- Thread yönetir
- Çöp toplar
- Ziyaret olaylarını metne çevirir Doğru cevap
Açıklama: ClassWriter olayları StringBuilder'da toplar.
2 implements bildirimini tamamla
class ClassWriter ____ ClassVisitor {}
class ClassWriter implements ClassVisitor {}
Açıklama: ClassWriter implements ClassVisitor ile arabirimi uygular.
3 ClassWriter öğelerini eşleştir
| Kavram | Anlamı |
|---|---|
implements |
Arabirim uygulama |
StringBuilder |
Metin birleştirme |
append |
Zincirleme ekleme |
toString |
Metni döndürme |