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
)までのチェーンを構築することを望んでいるようです。