Как создать агент jvmti, чтобы увидеть все загруженные классы, объекты и детали их полей - PullRequest
2 голосов
/ 25 июля 2011

Я хочу написать Java-агент для инструментов некоторых приложений. Я заинтересован в получении подробной информации об объектах (т.е. их полях), созданных приложениями. Я также хотел бы поймать любой доступ на чтение и запись к любому из этих объектов / их полей во время работы.

Подскажите, пожалуйста, как мне написать агентов и сообщить, какие классы и методы мне следует изучить. Я просто знаю о классе java.lang.instrument. Но я не смог найти там ничего, что могло бы поймать эти события.

Я также открыт для любых других техник инструментария Java, которые, как вы думаете, могут мне помочь.

1 Ответ

4 голосов
/ 25 июля 2011

Вы можете использовать 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 в classpath и запустите JVM с параметром -javaagent:lib/aspectjweaver.jar. Вот несколько примеров и документации http://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj.html

...