2 Stimmen

Java: Verfolgen Sie die Ausführung einer dynamisch geladenen Klasse

Grundsätzlich versuche ich dynamisch eine Klasse mit annotierten Methoden zu laden, die Hauptmethode der Klasse auszuführen und dann einige Code auszulösen, wenn die annotierten Methoden aufgerufen werden.

Beispiel :

public myclass {
public static void myMethod1(){
mymethod2();
}

@trace
public static void myMethod2(){
   ... etwas Code hier ...
}
public static void main(String[] args) {
mymethod1();
}
}

Das Programm traceHandler.java sollte in der Lage sein, jede Klasse zu laden, ihre Hauptmethode auszuführen und "Methode X aufgerufen" auszugeben, wenn eine annotierte X Methode aufgerufen wird. Ich habe den dynamischen Laden Teil erledigt, aber ich kann keinen Weg finden, "Hörer" auf die annotierten Methoden zu setzen.

Die Lösungen, die ich gefunden habe, beinhalten die Verwendung von AOP oder von Proxys, indem die Zielklassen einige Schnittstellen implementieren (1) gibt es noch einen anderen Weg, um das Ganze dynamisch zu machen, ohne in die Details der Zielklasse einzusteigen?

2voto

Abhinav Sarkar Punkte 22853

Sie können AspectJ verwenden, um die Methodenaufrufe zu verfolgen. Erstellen Sie Pointcuts, um Methoden anzusprechen, die mit Ihrer @trace-Annotation versehen sind, und erstellen Sie Joinpoints, um die Ausführung dieser Methoden abzufangen. Anschließend können Sie Ratschläge schreiben, in denen Sie die Methodenaufrufe in sysout oder einer Protokolldatei protokollieren können. Sehen Sie sich diesen Blog-Beitrag für ein Beispiel an.

1voto

ewernli Punkte 37122

Die Verwendung eines dynamischen Proxys ist meines Wissens der einfachste Weg, das Verhalten einer Klasse mit Annotationen zu "erweitern", ohne auf Instrumentierung oder Frameworks von Drittanbietern zurückzugreifen.

Der InvocationHandler kann vollständig generisch sein, er benötigt kein Wissen über die Zielklasse. Das Beispiel in Ihrem Link hat

private final Login realLogin;

aber das könnte durchaus ersetzt werden durch

private final Object realLogin;

denn der Aufruf erfolgt mit rückgabemethode.invoke(realLogin, args);.

Beachten Sie, dass Sie diese Technik nicht mit static Methoden verwenden können, wie in Ihrer Frage. Die Technik funktioniert tatsächlich nur bei Instanzmethoden und wenn das Objekt ein Interface implementiert.

0voto

Peter Tillemans Punkte 34359

Das Erstellen eines dynamischen Proxys erfordert nicht, dass Sie sich mit den Details der Zielklasse befassen, da alle Informationen, die Sie benötigen, im Aufruf von invoke() übergeben werden.

Schauen Sie sich http://download.oracle.com/javase/1.3/docs/guide/reflection/proxy.html an. Es ist nicht so beängstigend, wie es klingt.

Ich bin ein wenig verwirrt über das Problem, dass die Zielklassen keine Schnittstellen implementieren. Wenn Sie sie dynamisch laden möchten, müssen sie irgendwie ins größere Bild passen, und ich gehe immer davon aus, dass es eine Schnittstelle gibt, um sie manipulieren zu können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X