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);
    }
}

我想将任意的ClassVisitors 链交给一个方法。该方法将通过 a 读取类的字节,然后ClassReader使用 转换类ClassVisitors,然后通过 a 写入结果ClassWriterClassReader基本上,我想在“a and ”之间使用这些访问者的链(假设我不控制)ClassWriter,方法将控制其实例化。

我怎样才能做到这一点?似乎访问者的链接希望您构建从“后”(最后一个链接,绑定到 a ClassWriter)到“前”(第一个链接,accept()由 a 编辑ClassReader)的链。

4

2 回答 2

2

我会争论这样的设计。如果某个组件能够创建访问者,为什么它不能在传递给它的字节码上运行 ClassReader 和 ClassWriter?

但是如果你真的想自己创建访问者链,你可以使用工厂设计模式。因此,不是访问者,而是传入工厂来创建这些访问者,然后您可以在不了解访问者的情况下自己构建访问者链。

于 2013-02-28T15:36:22.170 回答
1

您可以尝试仅将访问者类传递给您的方法并通过反射将它们实例化。

于 2013-02-28T06:27:27.283 回答