是否可以方便地堆叠几个ASM字节码访问者?

问题描述 投票:1回答:1

我目前正在实现一些代码,对于类的每种方法,应该在.class文件上运行几个访问者,以检测其字节码。目前,我刚刚实现了MethodRenamerVisitor,但这已经变得很尴尬:

    ClassReader classReader = null;
    try {
        classReader = new ClassReader(monitoringFile.getCannonicalName());
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    ClassWriter classWriter = null;

    for (BytecodeMethod bytecodeMethod : bytecodeClass.bytecodeMethods) {
        System.out.println("\t" + bytecodeMethod.getName());

        classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);

        MethodRenamerVisitor methodRenamerVisitor = new MethodRenamerVisitor(classWriter, bytecodeMethod);
        classReader.accept(methodRenamerVisitor, 0);

        String outputFile = monitoringFile.getCannonicalName();
        outputFile = outputFile.replace('.', File.separatorChar)+".class";

        classReader = new ClassReader(classWriter.toByteArray());
    }

    try {
        fileSystem.writeToDisk(
                classFilename,
                classWriter.toByteArray()
                );
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

我现在正想将其他访问者应用于每个BytecodeMethods。我是否使这个复杂化了?如果可以采用以下形式,那将是理想的选择:

MultiVisitors multiVisitors = new MultiVisitors();
visitors.add(new AVisitor(...));
visitors.add(new BVisitor(...));
...
visitors.run();

因此,我可以轻松地堆叠我要运行的所有访问者,然后最后,我必须将它们保存在磁盘上。请记住,每个访问者都将添加/删除/修改其访问的方法!

java bytecode java-bytecode-asm
1个回答
0
投票

您已经堆叠了两个访问者-ClassWriter和MethodRenamerVisitor。基本上,链中的下一个访问者将作为构造函数的第一个参数传递。所以可以这样添加第三个:

ThirdVisitor v3 = new ThirdVisitor(methodRenamerVisitor);
ForthVisitor v4 = new ForthVisitor(v3);
// etc
© www.soinside.com 2019 - 2024. All rights reserved.