2017-06-13 11 views
0

Java Agentは、Javaプログラミング言語コードの計測に必要なサービスを提供します。 ClassFileTransformerはJava Agentの実装であり、JVMによってクラスが定義される前に変換が行われます。唯一のメソッドtransformは実装する必要があり、新しいクラス定義ごとに呼び出されます。私はすべての時間を計測することなく、インストルメントクラスファイルを実行できるように、インストルメントコードを保存したいインストルメント済みのJavaバイトコードをJavaエージェントで保存する方法は?

Java Agent

:どのようにJava Agent作品のイラスト。私がInterface Instrumentationをチェックしたとき、私は変換されたバイトコードを保存するための直接apiを見ませんでした。私の目標や他のツールを達成するためにJava Agentを使用することが可能かどうか疑問ですか?

+0

独自のクラスやサードパーティのライブラリをインストルメントしていますか? – vempo

+0

@vempo自分のクラス、ソースコードを利用できるサンプルコード。 – Qoros

答えて

1

実行時ではなく、ビルド時またはコンパイル時の計測が必要です。ほとんどのバイトコード計測ツールは、JavassistAspectJASMの両方をサポートしています。

実際にはエージェントによって計測されたバイトコードを.classファイルに保存することができます。その結果はクラスを表すバイト配列に過ぎません。ただし、エージェントで少なくとも1回プログラムを実行し、計測するすべてのクラスをロードして、.classファイルがそれぞれ作成されるようにする必要があります。だから私はこの方法をお勧めしません。あなたの目標は、定型的なコードとソースコードを汚染することなく、独自のクラスにいくつかの機能を追加する場合

if (shouldInstrument) { 

    CtClass cclass = pool.get(className.replaceAll("/", ".")); 

    // Instrument the class here 

    byte[] bytecode = cclass.toBytecode(); 

    File outputFile = new File(String.format("%s/%s.class", outputDirectory, className)); 
    Files.createDirectories(outputFile.getParentFile().toPath()); 

    try (FileOutputStream fos = new FileOutputStream(outputFile)) { 
     fos.write(bytecode); 
    } 

    return bytecode; 
} 

また、あなたの代わりにバイトコードのソースコードを操作することができます。ソース - >生成されたソース - >バイトコード(コンパイル)。たとえば、注釈とカスタムを使用します。annotation processor

+0

ありがとうございます。あなたはあなたのエージェントによって計装されたバイトコードを '.class'ファイルに保存すると述べました。私はそれを試みましたが、 'transform'関数がすべてのクラスに対して呼び出されたことがわかりました。私はまた、すべてのトランスフォームされたコードを1つのクラスに保存しようとしましたが、機能しません。 – Qoros

+0

私はあなたが必要とするクラスだけを測定し、それぞれのクラスファイルに保存できると言っていました。 – vempo

+0

「最上級クラス」とはどういう意味ですか?あなたは内部のクラスについて話していますか?私はあなたが間違った前提でここで働いていると思います。 1つのJavaソースファイルで宣言されたすべてのクラスには、それぞれ独自の.classファイルがあります。 transform()メソッドは、Javaソースファイルではなく、個々のクラスに適用されます。クラスは一度に1つずつ読み込まれます。私のコードを実行してみて、内部クラスのためにTest $ 1.class(匿名)、Test $ Inner.class、Test $ Inner $ Deeper.classなどのようなものが表示されます。 – vempo

関連する問題