2010-08-12 10 views

Antwort

25

Java-Code in Bytecode kompiliert (Foo.java ->> Foo.class). Die Bytecode-Injektion modifiziert zur Laufzeit Foo.class, um Code direkt vor dem Laden und Ausführen in den Code einzufügen.

ein Szenario vorstellen, wo ich wie oft Methode

in Foo.class
public void bar(); 

wird aufgerufen, um herauszufinden möchten. Ich könnte einen Agenten mit java.lang.instrument schreiben, der während des Ladens der Klasse Foo.class abfängt, ändert es unter Verwendung ASM, so dass bar() Aufrufe com.amir.agent.incrementCount() auf Methodeneintrag.

Jetzt kann ich mein Programm laufen:

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

und zur Laufzeit, Foo.class wird nicht nur seine normale Arbeit, es wird auch ich in MyAgent jedes Mal definiert funktionieren bar() aufgerufen wird.

Starten Sie here für einen Zeiger zum Schreiben eines Agenten von Grund auf neu.

1

Um den zweiten Teil Ihrer Frage zu adressieren. Ich benutze es, weil ich faul bin und nicht die Hälfte meines (Arbeits-) Lebens verbringen will, um Getter und Setter zu schreiben. Stattdessen lege ich eine Annotation @Data vor meine Klassendefinition und alles ist erledigt.

Sehen Sie die 3 Minuten Video-Demonstration auf Project Lombok.