2011-01-09 6 views
17

학업을 위해 Java 하위 집합을 구현하려고합니다. 글쎄, 난 마지막 단계 (코드 생성)에 그리고 난 방법의 인수를 처리하는 방법을 확인하기 위해 오히려 간단한 프로그램을 작성 :JVM 명령어 'main'메소드의 ALOAD_0이 'this'대신 'args'를 가리 킵니까?

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

나는 '주'메소드 구현 다음을 얻을 : 이 (분해 출력이 재스민에)

.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은 스택에 'this'를 밀어 넣어야합니다 (JVM 스펙이 말하는 것처럼 보입니다)
2. arraylength은 참조가 스택 상단에있는 배열의 길이를 반환합니다.

제게 따르면 1 & 2의 조합은 작동하지 않아야합니다.

어떻게 작동합니까? 또는 디스 어셈블러가 버그가 있으며 실제 바이트 코드가 다른 것입니까?

답변

39

aload_0는 '이'는 스택에

없음 매우 ... aload_0 메소드들 (또는,보다 일반적으로, 제 1 국부 기준 변수)를 제 기준 인수를 판독 푸시하도록되어 스택 위로 밀어 넣습니다.

멤버 함수에서 첫 번째 로컬 변수는 this 참조가됩니다.

그러나 main이 더 this 인수 없으며, 방법의 진정한 첫 번째 인수가 args 그래서 그것은 정적 기능입니다, 멤버 함수가 아닙니다.

+9

+1. this.foo (x, y)는 실제로 Foo.foo (this, x, y)입니다. – grinch

+0

* 모든 * 정적 메서드에 대해 true를 유지합니까? –

+0

@ dohaqatar7 예. –

관련 문제