2011-01-09 27 views
17

Akademik bir çalışma için bir Java alt kümesi uygulamaya çalışıyorum. Eh, son aşamalarında (kod oluşturma) yaşıyorum ve ben yöntemi argüman nasıl ele alındığını görmek oldukça basit bir program yazdım:JVM yönergesi ALOAD_0 'ana' yöntemde 'bu' yerine 'args' işaret eder?

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

Sonra onu inşa edilmiş bir online üzerinden 'Main.class' ran Çözücü buldum at: http://www.cs.cornell.edu/People/egs/kimera/disassembler.html

Ben 'ana' yöntemi için uygulanması şu olsun: (demonte çıktı Jasmin ise)

.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 

Bu benim sorun olduğunu:
1. aload_0 'bu' yığına referans üzerinde dizinin uzunluğunu geri gerekiyordu
2. arraylength (JVM spec söylemek görünüyor şu) itmek için gerekiyordu üstü yığın

Yani bana göre, 1 & 2 kombinasyonu bile çalışmaz.

Nasıl/neden çalışıyor? Veya disassembler arabası ve gerçek bytecode başka bir şey mi?

cevap

39

aload_0 'bu' yığınına üzerinde

Pek değil ... aload_0 yöntemin (ya da daha genel olarak, ilk yerel referans değişken) birinci referans argüman okur itmek gerekiyordu ve onu yığının üstüne iter.

Üye işlevlerinde, ilk yerel değişken this başvuru kaynağı olur.

Ama main hiçbir this argüman olduğunu ve yöntemin gerçek ilk argüman args yani bir statik işlevi var, üye işlev değildir.

+9

+1. this.foo (x, y) gerçekten Foo.foo (bu, x, y) – grinch

+0

Bu, tüm * statik yöntemler için geçerli mi? –

+0

@ dohaqatar7 Evet. –