同乙個 Java 檔案用不同的 jdk 編譯出的 class 檔案是一樣的嗎?

時間 2021-06-02 11:34:17

1樓:魯嚴波

不同廠商的jdk,甚至是同廠商的不同jdk版本,都有可能生成不同的class檔案。

首先,不管你用的是哪個jdk,編譯出來的檔案都是互相相容的,不管你是呼叫別人的方法、還是引用別人的常量,都是可以執行的。

需要注意的是,使用反射的話,有可能會有不相容。

然後,我們來看下class檔案會在哪兒變化:

0. minor_version, major_version這兩個,只要指定source和target就能確保編譯出來的檔案一樣。問題不大。

編譯優化會導致class檔案變化

雖然jdk在編譯時做的優化很少,但是還是會有不一樣。

比如常量傳播會導致class檔案常量池多乙個常量

不同的棧分配策略,會導致方法的locals變化

2. 一些內部結構的命名也會導致class檔案變化

(這個我還這真遇到過:https://www.robberphex.com/lambda-causes-arthas-cant-redefine/)

比如lamdba會生成乙個內部函式,這個函式的命名,在不同的版本JDK上的命名會不一樣。

然後還有匿名類的命名,這個一般不變,但是JLS沒有這個保證。

第一眼覺得這個問題問的沒有意義,我們只需要保證class檔案互相相容即可,為什麼要管「class 檔案是否一樣」?

但是,整理了下,很多hack技巧還是和這個有關的。

比如arthas的redefine機制,很多底層的報錯的排查,都需要這方面的知識。

2樓:周甜

我理解是不一樣的,想到的有兩處不一樣的地方

1、每個class檔案的開頭幾個位元組中有標識jdk版本的數值資訊,這個應該不一樣,比如jdk5編譯的是49,jdk6編譯的是50。

2、有些編譯器在編譯時會進行優化,比如將static final的常量直接inline到使用該常量的地方。

同乙個人可不可以用不同響度的聲音唱同乙個調的歌曲?

王大福吐奶 當然可以,在一首歌裡根據歌曲需要調整你的發聲是演唱中必備的技能,善用這種技巧可以的歌手一般會被評價為 唱歌非常有感情 一般來說這種歌手在各段的主歌副歌的處理上都會不同。代表人物 楊宗緯 曾一鳴。 當然可以。人聲發同乙個音高,音量範圍一般在30db 輕聲細語 到80db 放聲呼喊 之間。考...

java如何實現同乙個瀏覽器同的乙個系統只能登入乙個賬號,如果登入了第二個,第乙個賬號自動登出?

zhangs1314 樓主的意思可能是在同乙個瀏覽器裡面的不同的標籤頁,訪問了同乙個專案,後面登入進去的賬號,把前面登入進去的賬號踢掉.以前俺的做法,一般是用ws協議做長連線.每乙個長連線的唯一標記是乙個sessionId.登入的時候,先判斷是否有sessionId被儲存過.如果有,伺服器向這個se...

為什麼同乙個人用同乙個英雄卻在不同分段打出截然不同的戰績?

我和太陽肩並肩 1,銘文吧,我兩個小號都在都在鑽石段位,其中有個小號銘文只有90多級,賬號都還沒有30級,我大號常用上分英雄趙雲,貂蟬,花木蘭是不敢用的,只有玩玩長手法師才能維持遊戲樂趣這樣子的 2,隊友問題,不得不說鑽石局星耀局什麼妖怪都有,有菜得摳腳的,有菜得像根本沒有玩過這個遊戲的睿智玩家。而...