Простой способ собрать пару посетителей ASM-Bytecode? - PullRequest
1 голос
/ 31 октября 2011

В настоящее время я реализую некоторый код, который должен, для каждого метода класса, запускать пару посетителей в файле .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();

, чтобы я мог легко сложить всех посетителей, которых я хочу запустить, и тогда только в конце я должен был бы сохранить ихдиск.Имейте в виду, что каждый из посетителей будет добавлять / удалять / изменять методы, которые он посещает!

1 Ответ

0 голосов
/ 31 октября 2011

У вас уже есть два посетителя - ClassWriter и MethodRenamerVisitor.По сути, следующий посетитель в цепочке передается как первый параметр i-конструктор.Таким образом, третий можно добавить следующим образом:

ThirdVisitor v3 = новый ThirdVisitor (methodRenamerVisitor);ForthVisitor v4 = новый ForthVisitor (v3);и т.д.

...