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?
+1. this.foo (x, y) gerçekten Foo.foo (bu, x, y) – grinch
Bu, tüm * statik yöntemler için geçerli mi? –
@ dohaqatar7 Evet. –