Ich versuche, die Werte der Methodenparameter eines Java-Programms zu erhalten. Ich verwende ASM, um den Bytecode zu instrumentieren und diese Werte zu erhalten. Ich laufe jedoch in einige Schwierigkeiten.
Hier ist die Methode visitCode (), mit der der Code instrumentiert wird. Was es macht ist:
.
%Vor%Dies funktioniert jedoch nicht, wenn die Methode anscheinend mehr als einen Parameter hat.
Die erhaltene Klassendatei zeigt folgende Dinge:
%Vor%Wo 2 lokale Objekte erstellt werden, anstatt die Parameter zu laden.
Der Bytecode zeigt nichts Seltsames an:
%Vor%Und schließlich ist der angezeigte Fehler (bei Verwendung von -overify):
%Vor%Ansonsten ist es:
%Vor%Dies sollte normalerweise funktionieren, da ich gerade Informationen aus dem Stack-Frame lade. Ich habe auch versucht, statische & amp; nicht statische Methoden (wie aus dem Stapel hier erklärt: Ссылка ), aber immer noch ohne Erfolg. p>
Irgendeine Idee, warum das passiert, oder vielleicht eine Idee einer Lösung?
Danke:)
BEARBEITEN:
Es funktioniert jetzt, wenn primitive Typen (dank Vorschläge von int3 unten :) :)). Hier ist der Arbeitscode der Methode visitCode ():
%Vor% Sie verwenden aastore
, um eine char
in einem Objekt-Array zu speichern, was ein Typfehler ist. aastore
sollte nur zum Speichern von Objekten und Arrays verwendet werden, was wahrscheinlich der Grund ist, warum der Fehler 'erwartetes Objekt / Array auf Stack' lautet. Zeichen sollten in einem Char-Array mit castore
gespeichert werden. Da dies jedoch für beliebige Signaturen funktionieren soll, möchten Sie wahrscheinlich die primitiven Typen in Objekte einbetten, die Sie dann mit aastore
verwenden können - z. char
sollte in einem java.lang.Character
-Objekt eingerahmt werden.
Tags und Links java jvm bytecode bytecode-manipulation java-bytecode-asm