public class ChainingVisitors {
public static void main(String[] args) throws Exception {
ClassReader reader = new ClassReader("com.foo.Bar");
ClassWriter writer = new ClassWriter(COMPUTE_MAXS | COMPUTE_FRAMES);
ClassVisitor v3 = new Link(3, writer);
ClassVisitor v2 = new Link(2, v3);
ClassVisitor v1 = new Link(1, v2);
reader.accept(v1, 0);
System.out.printf("how many bytes in %s? %d\n", Runnable.class, writer.toByteArray().length);
}
private static class Link extends ClassVisitor {
private final int order;
public Link(int order, ClassVisitor next) {
super(ASM4, next);
this.order = order;
}
@Override public void visit(int i, int i2, String s, String s2, String s3, String[] strings) {
System.out.printf("In visitor %d\n", order);
super.visit(i, i2, s, s2, s3, strings);
}
}
ClassVisitor任意のsのチェーンをメソッドに渡したいのですが。このメソッドは、を介してクラスのバイトを読み取り、次にClassReaderを使用してクラスを変換し、ClassVisitorsを介して結果を書き込みClassWriterます。基本的に、私はこれらの訪問者のチェーンを使用したいと思います(これは、私が制御しないと仮定します)。aと、の「中間」でClassReader、ClassWriterそのインスタンス化がメソッドによって制御されます。
これどうやってするの?訪問者の連鎖は、「後ろ」(最後のリンク、に関連付けられているClassWriter)から「前」(最初のリンク、accept()によって編集されたClassReader)までのチェーンを構築することを望んでいるようです。