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

そのため、実行したいすべての訪問者を簡単にスタックでき、最終的にはそれらをディスクに保存する必要があります。訪問者の一人一人が訪問しているメソッドを追加/削除/変更することを覚えておいてください!

4

1 に答える 1

0

ClassWriterとMethodRenamerVisitorの2人の訪問者をすでに積み上げています。基本的に、チェーン内の次の訪問者は、最初のパラメーターiコンストラクターとして渡されます。したがって、3番目のものは次のように追加できます。

ThirdVisitor v3 = new ThirdVisitor(methodRenamerVisitor);
ForthVisitor v4 = new ForthVisitor(v3);
// etc
于 2011-10-31T13:45:14.453 に答える