2011-10-30 7 views
1

私は現在、クラスの各メソッドに対して、そのクラスのバイトコードを計測するために.classファイルで訪問者を実行する必要のあるコードを実装しています。現時点では、私はちょうどMethodRenamerVisitorを実装しましたが、これはすでにかなりぎこちないなっている:ASM-Bytecode訪問者のカップルを簡単に作成できますか?

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

ので、私は簡単に私が実行した後、端部のみで、私はディスク上に保存する必要があると思いたいすべての訪問者を積み重ねることができます:私はの形の何かを持っていることができれば理想的だろう。訪問者のそれぞれが訪問している方法を追加/削除/変更することに注意してください!

答えて

0

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

ThirdVisitor v3 = new ThirdVisitor(methodRenamerVisitor); ForthVisitor v4 =新しいForthVisitor(v3); など

+0

彼らはひどくつながっています。たとえば、実行時に、実行したいビジターを選択することはできません。 –

+0

カップリングはありません。コンストラクタはClassVisitorインスタンスを受け取ります。実行時にそれらをシャッフルしたい場合は、ファクトリのコレクションを作成し、各ファクトリは「以前の訪問者」のインスタンスを取得し、そのファクトリの特定の訪問者のインスタンスを作成します。ものすごく単純。私の経験では、そのようなものが必要なときにユースケースを見たことはありませんが。 –

+0

うーん、悪い。しかし、他の代替手段はないようです。 –

関連する問題