2011-01-09 7 views
17

Я пытаюсь реализовать подмножество Java для академического обучения. Ну, я на последних этапах (генерация кода), и я написал достаточно простую программу, чтобы увидеть, как обрабатываются аргументы метода:Команда JVM ALOAD_0 в методе «main» указывает на «args» вместо «this»?

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

Тогда я построил его, и побежал «Main.class» через интернет дизассемблер я нашел на сайте: http://www.cs.cornell.edu/People/egs/kimera/disassembler.html

Я получаю следующее реализации для «основной» методы: (разобранном выхода находится в 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 

Моя проблема с этим:
1. aload_0 должен нажимать «это» на стек (вот что говорит спецификация JVM)
2. arraylength должен возвращать длину массива, ссылка которого находится в верхней части стека

Так что по мне комбинация 1 & 2 не должна даже работать.

Как это работает/почему это работает? Или это ошибка дизассемблера, а фактический байт-код - это что-то еще?

ответ

39

aload_0 должен нажать «это» в стек

Не совсем ... aload_0 читает первых опорный аргумент (или, в более общем плане, первый локальный ссылочный переменным) методы и выталкивает его в стек.

В функциях-членах первая локальная переменная является ссылкой this.

Но main не функция, это статическая функция так нет this аргумента, и истинный первый аргумент метода args.

+9

+1. this.foo (x, y) действительно Foo.foo (this, x, y) – grinch

+0

Сохраняется ли это для * all * статических методов? –

+0

@ dohaqatar7 Да. –

 Смежные вопросы

  • Нет связанных вопросов^_^