Java Bytecode DUP

8

Ich wundere mich, warum die Exception im folgenden Bytecode (um eine Ausnahme auszulösen) dupliziert wird.

%Vor%     
LanguagesNamedAfterCofee 15.09.2012, 15:16
quelle

2 Antworten

10

Ich werde das Zeile für Zeile analysieren, wobei [] = neuer Stapel nachdem das Op verwendet wurde:

  1. NEW fügt ein neues IllegalArgumentException auf den Stapel [SomeIllegalArgumentException] ein
  2. DUP dupliziert es [SomeIllegalArgumentException, SomeIllegalArgumentException]
  3. INVOKESPECIAL öffnet die oberste Zeile und initialisiert sie durch Aufruf von & lt; init & gt; method [SomeIllegalArgumentException] (Die init-Methode gibt das Objekt nicht zurück auf den Stack, also muss das Objekt zuerst dupliziert werden, um es auf dem Stack zu behalten)
  4. ATHROW Wirf den anderen (ein Duplikat von dem, das wir initialisiert haben) []
Alex Coleman 15.09.2012, 15:23
quelle
6

Im Byte-Code wird zuerst ein Objekt von der Klasse erstellt, und dann wird ein Konstruktor für dieses Objekt aufgerufen. Die Signatur eines Konstruktors endet mit V für void , da nichts zurückgegeben wird. Dies bedeutet, dass eine Kopie der ursprünglichen Referenz auf das Objekt auf dem Stapel (oder in einer Variablen) aufbewahrt werden muss, damit sie nach dem Aufruf des Konstruktors ausgelöst werden kann.

BTW Der interne Name für einen Konstruktor lautet <init> und der interne Name für einen statischen Initialisierungscode lautet <clinit>

    
Peter Lawrey 15.09.2012 15:22
quelle

Tags und Links