학업을 위해 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의 조합은 작동하지 않아야합니다.
어떻게 작동합니까? 또는 디스 어셈블러가 버그가 있으며 실제 바이트 코드가 다른 것입니까?
+1. this.foo (x, y)는 실제로 Foo.foo (this, x, y)입니다. – grinch
* 모든 * 정적 메서드에 대해 true를 유지합니까? –
@ dohaqatar7 예. –