2011-01-09 7 views
17

Sto cercando di implementare un sottoinsieme di Java per uno studio accademico. Beh, sono nelle ultime fasi (la generazione di codice) e ho scritto un programma piuttosto semplice per vedere come metodo argomenti vengono gestiti:L'istruzione JVM ALOAD_0 nel metodo 'main' punta a 'args' invece di 'this'?

class Main { 
    public static void main(String[] args) { 
     System.out.println(args.length); 
    } 
} 

Poi ho costruito, e corsi 'Main.class' attraverso un on-line disassembler ho trovato su: http://www.cs.cornell.edu/People/egs/kimera/disassembler.html

ottengo la seguente implementazione per il metodo 'main': (l'uscita è smontato in Jasmin)

.method public static main([Ljava/lang/String;)V 
    .limit locals 1 
    .limit stack 2 

    getstatic java/lang/System/out Ljava/io/PrintStream; 
    aload_0 
    arraylength 
    invokevirtual java/io/PrintStream.println(I)V 
    return 
.end method 

il mio problema è:
1. aload_0 si suppone spingere 'questo' al pacco (questo è ciò che le specifiche JVM sembra dire)
2. arraylength dovrebbe restituire la lunghezza della matrice cui riferimento è sulla parte superiore dello stack

Quindi secondo me la combinazione di 1 & 2 non dovrebbe nemmeno funzionare.

Come/perché funziona? Oppure il disassemblatore è buggato e il codice byte attuale è un'altra cosa?

risposta

39

aload_0 dovrebbe spingere 'questo' al catasta

Non proprio ... aload_0 legge l'argomento primo riferimento (o, più in generale, la prima variabile di riferimento locale) del metodo e lo spinge in pila.

Nelle funzioni membro, la prima variabile locale risulta essere il riferimento this.

Ma main non è una funzione membro, è una funzione statica quindi non c'è this argomento, e il vero primo argomento del metodo è args.

+9

+1. this.foo (x, y) è veramente Foo.foo (this, x, y) – grinch

+0

Questo vale per i metodi statici * all *? –

+0

@ dohaqatar7 Sì. –

Problemi correlati