2011-07-25 3 views
1

Je veux écrire un agent java pour instrumenter certaines applications. Je suis intéressé à obtenir les détails des objets, (c'est-à-dire leurs champs) instanciés par les applications. Je voudrais également attraper tout accès en lecture et en écriture à l'un de ces objets/leurs champs en cours d'exécution.Comment créer un agent jvmti pour voir toutes les classes, objets et leurs champs chargés

Pouvez-vous me guider en écrivant les agents et dites-moi quelles classes et méthodes dois-je explorer. Je connais juste la classe java.lang.instrument. Mais je n'ai rien trouvé qui puisse attraper ces événements.

Je suis également ouvert à toutes les autres techniques d'instrumentation java que vous pensez pouvoir m'aider.

Répondre

3

Vous pouvez utiliser le AspectJ avec un tissage en mode chargement (javaagent). Vous pouvez, par exemple, écrire des aspects pour surveiller les appels du constructeur (appel/pointage d'exécution) et surveiller l'accès au champ (set/get pointcuts). J'utilise le développement basé sur des annotations. Par exemple, pour surveiller le réglage de tous les champs et non statiques nontransient dans non définitif de toutes les classes dans le package donné que vous pouvez créer aspect:

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

en place META-INF aop.xml:

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

Lieu acpectjrt.jar et aspectjweaver.jar sur classpath et exécutez votre JVM avec le paramètre -javaagent:lib/aspectjweaver.jar. Voici quelques exemples et documents http://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj.html

+0

ok je suis un débutant et se confondre. Pouvez-vous me donner quelques exemples de base pour les aspects que j'ai trouvés vraiment confondre moi. – Ankit

+0

Hey Zach, je n'ai pas complètement eu l'idée d'utiliser aspectj avec javaagent. pouvez-vous me diriger vers une page où je peux voir quelques exemples de base et les essayer moi-même pour avoir une idée de tout cela. – Ankit

+0

@Ankit: s'il vous plaît fournir quelques exemples concrets ce que vous voulez alors je vais vous fournir des exemples de solutions. Et ofc liens :) – zacheusz

Questions connexes