Eine Java-Bytecode-Anweisung lesen: Was bedeutet die Zahl?

8

Ich habe Java-Bytecode gelesen und folgendes gesehen:

%Vor%

Was bedeutet #5 ?

Und wie kann ich ein Programm in Bytecode schreiben?

    
Arvin 17.02.2012, 21:33
quelle

2 Antworten

6

Java-Klassendateien und Bytecode

Java-Klassendateien (Bytecode-Dateien) bestehen aus verschiedenen Komponenten:

Ссылка

  • Magische Zahl: 0xCAFEBABE
  • Version des Class File Formats: die Neben- und Hauptversionen der Klassendatei
  • Konstanter Pool: Konstantenpool für die Klasse
  • (...)
  • Felder: Alle Felder in der Klasse
  • Methoden: Alle Methoden in der Klasse
  • Attribute: Alle Attribute der Klasse (zB der Name der Quelldatei, etc.)

Die Zahl # 5 bezieht sich einfach auf einen Ort im Konstantenpool. Und an dieser Position wird eine CONSTANT_FieldRef gefunden, die neben anderen Attributen einen Verweis auf einen CONSTANT_NameAndType enthält. Und CONSTANT_NameAndType enthält eine Referenz auf eine CONSTANT_Utf8 (die die tatsächliche Zeichenfolge / den tatsächlichen Namen enthält).

So sieht der Ablauf folgendermaßen aus:

%Vor%

Ссылка

Anstatt eine ganze Zeichenfolge in jeder getfield Anweisung zu speichern, wird eine Zahl gespeichert. Dies verbessert die Leistung im Interpreter (oder JIT) und den Platz in der Klassendatei.

Von Hand geschriebene Bytecodes

Handgeschriebene Bytecodes können mit diesem Tool zu einer Klassendatei zusammengestellt werden (es enthält viele Beispiele):

Ссылка

    
Lasse Espeholt 17.02.2012, 21:38
quelle
4

Die Anweisung getfield (IIRC) führt einen Verweis in den Konstantenpool der Klassendatei aus, um Informationen darüber zu erhalten, welches Feld gesucht werden sollte. Die Nummer 5 bedeutet hier "Konstante Pooleintragsnummer 5", und dieser konstante Pool enthält dann die Information "Nach dem Feld name vom Typ java.lang.String suchen". Der Grund dafür ist, dass die Größe von% co_de beibehalten wird % Anweisung ist gleich, unabhängig vom Namen oder Typ des zu suchenden Feldes.

Ich bin mir nicht sicher, ob ich verstehe, was Sie mit "Wie kann ich Programm in Bytecode schreiben?" Das ist eine ziemlich offene Frage; Es ist vergleichbar mit der Frage, wie man Programme in einer beliebigen Sprache schreibt, und erfordert viel Lernen. Vielleicht möchten Sie sich den Jasmin Java-Assembler ansehen, der diesen Prozess erheblich vereinfachen kann.

Hoffe, das hilft!

    
templatetypedef 17.02.2012 21:37
quelle

Tags und Links