2011-04-25 103 views
4

我想了解如何通過查看其二進制數據來確定.class文件的版本。我知道使用javap會告訴我的版本 - 但不幸的是,我並不總是有一個JDK安裝在我需要檢查的機器上。然而,我有機會獲得一個普通的舊HEX編輯...如何知道編譯了一個.class文件的Java版本?

我試圖從認證的來源這一發現的文件 - 所有我能想出了這一點:http://fredericktang.wordpress.com/2007/09/28/java-class-file-version/
雖然這個博客帖子是非常漂亮書面 - 它並沒有真正的官方Java文檔備份。

任何提示?

編輯:沒關係 - 遺憾的錯誤 - 我發現規格: here

+0

+1好問題! – 2011-04-25 19:21:07

+2

[Java API查找類文件編譯的JDK版本的可能的重複?](http://stackoverflow.com/questions/1293308/java-api-to-find-out-the-jdk-version- a-class-file-is-compiled-for) – McDowell 2011-04-25 19:37:07

+0

@McDowell - 我不認爲它是重複的。編程獲取信息與使用HEX編輯器查看文件的方式不同。 – RonK 2011-04-25 19:43:46

回答

2

JVM specification大約是權威,你會得到。 Chapter 4可能是你以後的事情。

+0

謝謝 - 這是我一直在尋找的鏈接(並最終由我自己找到:)) – RonK 2011-04-25 19:17:52

4

您引用的文檔實際上是JVM類文件規範的逐字轉錄(轉換爲更簡單的英文)。

一些hitoric值的我一直得心應手

Major Major(hex) Minor Java platform version 
45  2d   3   1.0 
45  2d   3   1.1 
46  2e   0   1.2 
47  2f   0   1.3 
48  30   0   1.4 
49  31   0   1.5 
50  32   0   1.6 

---編輯響應尼爾的看法,即1.0和1.1使用相同的主要次要號碼---

從類的頭,我們無法確定該類是否針對1.0或1.1版本的Java進行編譯。也就是說,還有其他一些技術可以幫助確定一個類是否是針對1.0或1.1編譯的。

首先,如果該類是針對1.1編譯的,那麼它可能包含一個僅包含1.1的庫類。一旦您在其中一個類中找到其中一個類,就可以安全地得出結論,它是一個針對Java 1.1編譯的類。

請注意,可以在類的開頭搜索常量池,以確定類文件需要完全解析所有外部引用的類。

單獨搜索類很麻煩,幸運的是還添加了很多包。下面的包是特定於Java 1.1,這是他們沒有在Java 1.0中包含

+ java.awt.datatransfer 
+ java.awt.event 
+ java.beans 
+ java.lang.reflect 
+ java.math 
+ java.rmi.dgc 
+ java.rmi 
+ java.rmi.registry 
+ java.rmi.server 
+ java.security.acl 
+ java.security 
+ java.security.interfaces 
+ java.sql 
+ java.text 
+ java.util.zip 

在柵欄的另一邊,很多呼叫以下方法建議(但不是實際的證明),該代碼是針對Java 1.0編寫的,因爲它們在Java 1.1中被棄用,原因是新的awt事件重構。

Deprecated Classes 

java.io.LineNumberInputStream: 
    LineNumberInputStream is deprecated. 
java.io.StringBufferInputStream: 
    StringBufferInputStream is deprecated. 

Deprecated Methods 

java.awt.BorderLayout: 
    addLayoutComponent() is deprecated. 
java.awt.CardLayout: 
    addLayoutComponent() is deprecated. 
java.awt.CheckboxGroup: 
    getCurrent() is deprecated. 
java.awt.CheckboxGroup: 
    setCurrent() is deprecated. 
java.awt.Choice: 
    countItems() is deprecated. 
java.awt.Component: 
    getPeer() is deprecated. 
java.awt.Component: 
    enable() is deprecated. 
java.awt.Component: 
    enable() is deprecated. 
java.awt.Component: 
    disable() is deprecated. 
java.awt.Component: 
    show() is deprecated. 
java.awt.Component: 
    show() is deprecated. 
java.awt.Component: 
    hide() is deprecated. 
java.awt.Component: 
    location() is deprecated. 
java.awt.Component: 
    move() is deprecated. 
java.awt.Component: 
    size() is deprecated. 
java.awt.Component: 
    resize() is deprecated. 
java.awt.Component: 
    resize() is deprecated. 
java.awt.Component: 
    bounds() is deprecated. 
java.awt.Component: 
    reshape() is deprecated. 
java.awt.Component: 
    preferredSize() is deprecated. 
java.awt.Component: 
    minimumSize() is deprecated. 
java.awt.Component: 
    layout() is deprecated. 
java.awt.Component: 
    inside() is deprecated. 
java.awt.Component: 
    locate() is deprecated. 
java.awt.Component: 
    deliverEvent() is deprecated. 
java.awt.Component: 
    postEvent() is deprecated. 
java.awt.Component: 
    handleEvent() is deprecated. 
java.awt.Component: 
    mouseDown() is deprecated. 
java.awt.Component: 
    mouseDrag() is deprecated. 
java.awt.Component: 
    mouseUp() is deprecated. 
java.awt.Component: 
    mouseMove() is deprecated. 
java.awt.Component: 
    mouseEnter() is deprecated. 
java.awt.Component: 
    mouseExit() is deprecated. 
java.awt.Component: 
    keyDown() is deprecated. 
java.awt.Component: 
    keyUp() is deprecated. 
java.awt.Component: 
    action() is deprecated. 
java.awt.Component: 
    gotFocus() is deprecated. 
java.awt.Component: 
    lostFocus() is deprecated. 
java.awt.Component: 
    nextFocus() is deprecated. 
java.awt.Container: 
    countComponents() is deprecated. 
java.awt.Container: 
    insets() is deprecated. 
java.awt.Container: 
    layout() is deprecated. 
java.awt.Container: 
    preferredSize() is deprecated. 
java.awt.Container: 
    minimumSize() is deprecated. 
java.awt.Container: 
    deliverEvent() is deprecated. 
java.awt.Container: 
    locate() is deprecated. 
java.awt.FontMetrics: 
    getMaxDecent() is deprecated. 
java.awt.Frame: 
    setCursor() is deprecated. 
java.awt.Frame: 
    getCursorType() is deprecated. 
java.awt.Graphics: 
    getClipRect() is deprecated. 
java.awt.List: 
    countItems() is deprecated. 
java.awt.List: 
    clear() is deprecated. 
java.awt.List: 
    isSelected() is deprecated. 
java.awt.List: 
    allowsMultipleSelections() is deprecated. 
java.awt.List: 
    setMultipleSelections() is deprecated. 
java.awt.List: 
    preferredSize() is deprecated. 
java.awt.List: 
    preferredSize() is deprecated. 
java.awt.List: 
    minimumSize() is deprecated. 
java.awt.List: 
    minimumSize() is deprecated. 
java.awt.List: 
    delItems() is deprecated. 
java.awt.Menu: 
    countItems() is deprecated. 
java.awt.MenuBar: 
    countMenus() is deprecated. 
java.awt.MenuComponent: 
    getPeer() is deprecated. 
java.awt.MenuComponent: 
    postEvent() is deprecated. 
java.awt.MenuContainer: 
    postEvent() is deprecated. 
java.awt.MenuItem: 
    enable() is deprecated. 
java.awt.MenuItem: 
    enable() is deprecated. 
java.awt.MenuItem: 
    disable() is deprecated. 
java.awt.Polygon: 
    getBoundingBox() is deprecated. 
java.awt.Polygon: 
    inside() is deprecated. 
java.awt.Rectangle: 
    reshape() is deprecated. 
java.awt.Rectangle: 
    move() is deprecated. 
java.awt.Rectangle: 
    resize() is deprecated. 
java.awt.Rectangle: 
    inside() is deprecated. 
java.awt.ScrollPane: 
    layout() is deprecated. 
java.awt.Scrollbar: 
    getVisible() is deprecated. 
java.awt.Scrollbar: 
    setLineIncrement() is deprecated. 
java.awt.Scrollbar: 
    getLineIncrement() is deprecated. 
java.awt.Scrollbar: 
    setPageIncrement() is deprecated. 
java.awt.Scrollbar: 
    getPageIncrement() is deprecated. 
java.awt.TextArea: 
    insertText() is deprecated. 
java.awt.TextArea: 
    appendText() is deprecated. 
java.awt.TextArea: 
    replaceText() is deprecated. 
java.awt.TextArea: 
    preferredSize() is deprecated. 
java.awt.TextArea: 
    preferredSize() is deprecated. 
java.awt.TextArea: 
    minimumSize() is deprecated. 
java.awt.TextArea: 
    minimumSize() is deprecated. 
java.awt.TextField: 
    setEchoCharacter() is deprecated. 
java.awt.TextField: 
    preferredSize() is deprecated. 
java.awt.TextField: 
    preferredSize() is deprecated. 
java.awt.TextField: 
    minimumSize() is deprecated. 
java.awt.TextField: 
    minimumSize() is deprecated. 
java.awt.Window: 
    postEvent() is deprecated. 
java.io.ByteArrayOutputStream: 
    toString() is deprecated. 
java.io.DataInputStream: 
    readLine() is deprecated. 
java.io.PrintStream: 
    PrintStream() is deprecated. 
java.io.PrintStream: 
    PrintStream() is deprecated. 
java.io.StreamTokenizer: 
    StreamTokenizer() is deprecated. 
java.lang.Character: 
    isJavaLetter() is deprecated. 
java.lang.Character: 
    isJavaLetterOrDigit() is deprecated. 
java.lang.Character: 
    isSpace() is deprecated. 
java.lang.ClassLoader: 
    defineClass() is deprecated. 
java.lang.Runtime: 
    getLocalizedInputStream() is deprecated. 
java.lang.Runtime: 
    getLocalizedOutputStream() is deprecated. 
java.lang.String: 
    String() is deprecated. 
java.lang.String: 
    String() is deprecated. 
java.lang.String: 
    getBytes() is deprecated. 
java.lang.System: 
    getenv() is deprecated. 
java.net.Socket: 
    Socket() is deprecated. 
java.net.Socket: 
    Socket() is deprecated. 
java.util.Date: 
    Date() is deprecated. 
java.util.Date: 
    Date() is deprecated. 
java.util.Date: 
    Date() is deprecated. 
java.util.Date: 
    Date() is deprecated. 
java.util.Date: 
    UTC() is deprecated. 
java.util.Date: 
    parse() is deprecated. 
java.util.Date: 
    getYear() is deprecated. 
java.util.Date: 
    setYear() is deprecated. 
java.util.Date: 
    getMonth() is deprecated. 
java.util.Date: 
    setMonth() is deprecated. 
java.util.Date: 
    getDate() is deprecated. 
java.util.Date: 
    setDate() is deprecated. 
java.util.Date: 
    getDay() is deprecated. 
java.util.Date: 
    getHours() is deprecated. 
java.util.Date: 
    setHours() is deprecated. 
java.util.Date: 
    getMinutes() is deprecated. 
java.util.Date: 
    setMinutes() is deprecated. 
java.util.Date: 
    getSeconds() is deprecated. 
java.util.Date: 
    setSeconds() is deprecated. 
java.util.Date: 
    toLocaleString() is deprecated. 
java.util.Date: 
    toGMTString() is deprecated. 
java.util.Date: 
    getTimezoneOffset() is deprecated. 

它是可以證明的Java代碼的版本是1.1,但只在某些情況下(如果該代碼使用新增加的1.1的功能)。通常不可能證明Java代碼是1.0,但是沒有任何Java 1.1特性的使用,並且大量使用Java的不推薦使用的特性暗示了針對Java 1.0環境的類。

我不知道任何可能能夠區分這兩者的行內標籤(行號表中的差異等)。),主要是因爲我沒有必要在十六進制編輯器中挖掘1.0和1.1類。

+0

要麼我不理解你的表,要麼其中一些值沒有意義,或者你錯誤地轉錄了它們... – Neil 2011-04-25 19:33:56

+0

尼爾是對的。 45 = 2d 46 = 2e 看看你的價值 – RonK 2011-04-25 19:41:30

+0

@尼爾,對不起,我轉錄了他們不正確。我現在會解決它們。 – 2011-04-25 20:46:29

相關問題