Ich arbeite an a fork von FernFlower von Jetbrains und ich habe kleinere Verbesserungen hinzugefügt.JVM Bytecode, wie finde ich den Typ der lokalen Variablen?
Eine Sache, die mich wirklich nervt über FernFlower ist, dass es den Typ der lokalen Variablen basierend auf seinem Wert in bpush/Spush usw. basiert. Jode und Procyon finden irgendwie eine Möglichkeit, den ursprünglichen Wert einer lokalen Variablen zu finden.
Hier ist der ursprüngliche Quellcode.
public static void main(String[] args) throws Exception {
int hello = 100;
char a2 = 100;
short y1o = 100;
int hei = 100;
System.out.println(a2+" "+y1o+", "+hei+", "+hello);
}
Wenn mit FernFlower dekompilierten, gibt er dies:
public static void main(String[] args) throws Exception {
byte hello = 100;
char a2 = 100;
byte y1o = 100;
byte hei = 100;
System.out.println(a2 + " " + y1o + ", " + hei + ", " + hello);
}
Aber wenn sie mit Jode/Procyon dekompilierten gibt es die ursprünglichen lokalen Variablen-Typen:
public static void main(String[] args)
throws Exception
{
int hello = 100;
char a2 = 'd';
short y1o = 100;
byte hei = 100;
System.out.println(a2 + " " + y1o + ", " + hei + ", " + hello);
}
ich mich gefragt, wie ist dies möglich, weil ich dachte, dass keine lokale Variable Typ Informationen zur Kompilierzeit gespeichert ist? Wie kann ich die gleiche Funktionalität zu FernFlower hinzufügen?
Ist es möglich, dass die Dekompiler Freiheiten bei der Entscheidung, welchen lokalen Typ zu verwenden (z. B. "Byte" gegenüber "Int") genommen haben? –
Sie sollten in vielen Fällen aus den Anweisungen, die diese Slots verwenden, schließen können. Sehen Sie sich den Byte-Code selbst an, insbesondere die verschiedenen Überladungen von 'String.valueOf()', die aufgerufen werden. In diesem Fall scheint es auch einige Debug-Informationen zu geben, ansonsten wären die Namen auch nicht verfügbar gewesen. – EJP
Ohne Debugging-Informationen würde es keine LocalVariableTable im kompilierten Code geben, so dass ich nicht sehe, wie der ursprüngliche deklarierte Typ abgeleitet werden kann. –