2012-04-11 9 views
0

Angesichts der .class-Datei der Java-Klasse A gibt es einen Weg (mit BCEL, ASM, etc. zum Beispiel), eine bestimmte Bytecode-Sequenz zu extrahieren (angenommen, es ist ein Basisblock) , platzieren Sie es an einem separaten Ort, und führen Sie später diese Sequenz von Bytecodes aus?Extrahieren und Ausführen einer beliebigen Folge von Java-Bytecodes

Beispiel: Quellcode hat die Zeilen ... a + = b; b + = 21; . .

Ich habe nur Zugriff auf die Bytecode-Darstellung. Ich möchte diese Bytecodes extrahieren und sie als Blackbox behandeln. In den Anweisungen der Klasse A anstelle der Quellzeile 'a + = b;' Ich möchte, dass es auf diese externe Black Box X zeigt, die die passende fehlende Bytecode-Sequenz enthält. Ich möchte der Black Box alle notwendigen Variablen auf dem Stack-Frame zuführen (zum Beispiel die aktuellen Werte von a, b, vielleicht Methodenparameter, die in der Blackbox X zu verwenden sind ...) und dann nach der Ausführung der Bytecode-Sequenz Die Blackbox gibt die Kontrolle an die ursprüngliche Klasse A zusammen mit den neu aktualisierten Rahmenvariablen zurück ...

Danke für jede Idee.

Edit:

Wie unten vorgeschlagen, die Black Box am vernünftigsten wäre innerhalb einer Stub-Klasse-Datei eine Stub-Methode sein. Die Frage wird dann, wie kann ich diese wohlgeformte Stub-Klasse und -Methode aus dieser Befehlssequenz am vernünftigsten erzeugen, und wie steuere ich die Steuerung von der ursprünglichen Klasse A. Idealerweise würde dies 'offline' beim Kompilieren erfolgen Zeit.

Antwort

1

Der schwierige Teil ist, wie Sie Ihre Befehlssequenz identifizieren. Ich kann mir das vorstellen, indem ich am Anfang und am Ende der Sequenz eine Zeilennummer oder einen Marker-Methodenaufruf anwende.

Wenn Sie das aussortiert haben, können Sie ASMs Analysepaket verwenden, um Arten von lokalen Variablen und Stack-Slots zu berechnen und sie als Parameter einer Methode offen zu legen, wo Sie Ihre Bytecode-Sequenz kopieren würden.

Meine article from AOSD'07 sollte Ihnen einen guten Ausgangspunkt mit ASM geben. Ersetzen Sie die Abschnitte Methodenkörper und Inline-Methode, die Transformationen beschreiben, die sehr ähnlich denen sind, die Sie möglicherweise verwenden müssen.

+0

Großer Artikel. Ein großer Grund, warum ASM ein so gutes Werkzeug ist, ist die hervorragende Dokumentation. – ChaimKut

2

Die einzige Möglichkeit zum Ausführen von Bytecodes in einer JVM-spezifikationskonformen Java-Implementierung besteht darin, die Bytecodes in eine (wohlgeformte) Klassendatei zu stellen und diese Datei zu laden. (Das bedeutet, dass die Bytecodes mit "Methoden" in der Klassendatei umschlossen werden müssen, da Bytecodes nur an diese Stelle gehen können.)

Zusätzlich müssen die Bytecodes alle Sicherheitsregeln befolgen, die erzwungen werden durch den Bytecode-Verifizierer. Das wird Ihre Fähigkeit einschränken, beliebige Sequenzen auszuführen.

Wenn Sie nur versuchen herauszufinden, was eine Bytecode-Sequenz macht, ist es besser, sie manuell auszuführen oder eine Art Bytecode-Emulator zu verwenden.

Verwandte Themen