2

一部のアプリケーションを計測するための Java エージェントを作成したいと考えています。アプリケーションによってインスタンス化されたオブジェクト (つまり、フィールド) の詳細を取得することに関心があります。また、実行中にこれらのオブジェクト/フィールドへの読み取りおよび書き込みアクセスをキャッチしたいと思います。

エージェントの書き方を教えてください。どのクラスとメソッドを調べる必要があるか教えてください。java.lang.instrument クラスについて知っているだけです。しかし、これらのイベントをキャッチできるものは見つかりませんでした。

また、あなたが私に役立つと思われる他の Java 計測技術も受け入れます。

4

1 に答える 1

4

AspectJはロード時のウィービング (javaagent) で使用できます。たとえば、コンストラクター呼び出し (呼び出し/実行ポイントカット) を監視したり、フィールド アクセス (ポイントカットの設定/取得) を監視したりするアスペクトを作成できます。

私は注釈ベースの開発を使用しています。たとえば、特定のパッケージ内のすべてのクラスのすべての非静的非最終フィールドおよび非一時フィールドの設定を監視するには、アスペクトを作成できます。

@Aspect
public class MonitorAspect {   
     @Around(" set(!static !final !transient * (*) . *) && args(newVal) && target(t) && within(your.target.package.*) ")
    public void aroundSetField(ProceedingJoinPoint jp, Object t, Object newVal) throws Throwable{
        Signature signature = jp.getSignature();
        String fieldName = signature.getName();
        Field field = t.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        Object oldVal = field.get(t);
        System.out.println("Before set field. "
                + "oldVal=" + oldVal + " newVal=" + newVal + " target.class=" + t.getClass());
        jp.proceed();
    }
}

META-INF で aop.xml を配置:

<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
    <aspects>
        <aspect name="your.package.MonitorAspect" />
    </aspects>
</aspectj>

クラスパスにacpectjrt.jarとaspectjweaver.jarを配置し、-javaagent:lib/aspectjweaver.jarパラメーターを指定してJVMを実行します。ここにいくつかの例とドキュメントがありますhttp://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj.html

于 2011-07-25T06:55:52.897 に答える