2010-08-12 6 views

Répondre

25

code Java compile en bytecode (Foo.java ->> Foo.class). L'injection de bytecode est en train de modifier Foo.class lors de l'exécution pour y injecter du code juste avant son chargement et son exécution.

Imaginez un scénario où je veux savoir comment la méthode de fois

public void bar(); 

est invoquée dans Foo.class. Je pourrais écrire un agent en utilisant java.lang.instrument qui intercepte Foo.class pendant le chargement de classe, le modifie en utilisant ASM de sorte que bar() appelle com.amir.agent.incrementCount() sur l'entrée de la méthode.

Maintenant, je peux courir mon programme:

$java -javagent:MyAgent Foo //assuming Foo has a main() defined 

et à l'exécution, Foo.class sera non seulement son travail normal, il sera également ne fonctionnent que je définis en MyAgent chaque fois bar() est invoquée.

Pour un pointeur sur l'écriture d'un agent à partir de zéro, commencez here.

1

Pour répondre à la deuxième partie de votre question. Je l'utilise depuis que je suis paresseux et que je ne veux pas passer la moitié de ma vie (de travail) à écrire des getters et setters. Au lieu de cela, j'ai mis une annotation @Data avant la définition de ma classe et tout est fait.

Voir la démonstration vidéo de 3 minutes au Project Lombok.

Questions connexes