実行時ではなく、ビルド時またはコンパイル時の計測が必要です。ほとんどのバイトコード計測ツールは、Javassist、AspectJ、ASMの両方をサポートしています。
実際にはエージェントによって計測されたバイトコードを.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。
独自のクラスやサードパーティのライブラリをインストルメントしていますか? – vempo
@vempo自分のクラス、ソースコードを利用できるサンプルコード。 – Qoros