2011-07-01 128 views
0

我遇到以下問題:編譯某些類時,如果在不同的目錄中執行編譯,則會生成不同的.class文件。生成的.class文件之間的差異是以下:如果源編譯在不同的目錄中,編譯器輸出(.class文件)會有所不同

1)版本:

1062: aload_3 
1063: invokevirtual <some_method> 
1066: goto 1078 
1069: astore 15 
1071: aload_3 
1072: invokevirtual <some_method> 
1075: aload 15 
1077: athrow 
1078: aload_3 
1079: areturn 

2)版本:

1062: jsr 1076 
1065: goto 1084 
1068: astore 15 
1070: jsr 1076 
1073: aload 15 
1075: athrow 
1076: astore 16 
1078: aload_3 
1079: invokevirtual <some_method> 
1082: ret 16 
1084: aload_3 
1085: areturn 

以上代碼具有相同的執行邏輯。不幸的是,我必須解釋爲什麼編譯器會以這種方式運行。奇怪的是,有時即使在同一個目錄中編譯相同的源代碼,也會出現連續編譯之間的差異(總是與上面提到的相同)。

任何想法會發生什麼? 預先感謝您的回覆!

+0

你是從命令行編譯嗎?你的javac調用是什麼? – Atreys

+0

如果您的指令編號超過了千分之一,則您的方法顯然太長。 –

+0

您使用的是哪個版本(或更好的版本)的JDK?看起來你的第二個版本是用比第一個更早的javac創建的。 –

回答

0

該類是否使用具有包級別作用域的任何方法或類?這可以解釋任何差異。

+0

這爲什麼會影響一切? –

相關問題