0
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と、の「中間」でClassReaderClassWriterそのインスタンス化がメソッドによって制御されます。

これどうやってするの?訪問者の連鎖は、「後ろ」(最後のリンク、に関連付けられているClassWriter)から「前」(最初のリンク、accept()によって編集されたClassReader)までのチェーンを構築することを望んでいるようです。

4

2 に答える 2

2

私はそのようなデザインを主張します。一部のコンポーネントがビジターを作成できる場合、渡されたバイトコードで ClassReader と ClassWriter を実行できないのはなぜですか?

しかし、本当に訪問者の連鎖を自分で作成したい場合は、Factory デザイン パターンを使用できます。したがって、訪問者の代わりにファクトリを渡してそれらの訪問者を作成すると、訪問者について知らなくても自分で訪問者チェーンを構築できます。

于 2013-02-28T15:36:22.170 に答える
1

ビジター クラスだけをメソッドに渡して、リフレクションを介してインスタンス化することもできます。

于 2013-02-28T06:27:27.283 に答える