2011-04-25 3 views
4

Je suis en train de découvrir comment je peux déterminer la version d'un fichier .class en regardant ses données binaires. Je sais que l'utilisation javap me dira la version - mais malheureusement, je n'ai pas toujours un JDK installé sur la machine où j'ai besoin de vérifier. Je n'ai cependant accès à un éditeur ancien HEX plaine ...Comment puis-je savoir avec quelle version de Java un fichier .class a été compilé?

J'ai essayé de trouver la documentation sur ce à partir d'une source certifiée - tout ce que je pouvais trouver était avec ceci: http://fredericktang.wordpress.com/2007/09/28/java-class-file-version/
Bien que ce blog est très bien écrit - il n'est pas vraiment sauvegardé par la documentation Java officielle.

Un conseil?

Edit: Never mind - désolé de bug - je l'ai trouvé la spécification: here

+0

+1 Bonne question! –

+2

duplication possible de [Java API pour trouver la version JDK pour laquelle un fichier de classe est compilé?] (Http://stackoverflow.com/questions/1293308/java-api-to-find-out-the-jdk-version- a-class-file-is-compiled-for) – McDowell

+0

@McDowell - Je ne le vois pas comme un doublon. Obtenir des informations par programme n'est pas la même chose que de le faire en visualisant un fichier avec un éditeur HEX. – RonK

Répondre

2

Le JVM specification est à peu près aussi autorité que vous allez obtenir. Chapter 4 est probablement ce que vous cherchez.

+0

Merci - c'était le lien que je cherchais (et j'ai réussi à trouver par la suite :) :) – RonK

4

La documentation que vous avez référencée est pratiquement une transcription mot à mot (en anglais plus facile) de la spécification de fichier de classe JVM.

Certaines des valeurs hitoric je garde à portée de main

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 

--- Edité en réponse à l'observation de Neil que 1.0 et 1.1 utilisent les mêmes grands nombres mineurs ---

De l'en-tête de classe, on ne peut pas déterminer si la classe a été compilée avec une version 1.0 ou 1.1 de Java. Cela dit, il existe un certain nombre d'autres techniques qui peuvent aider à déterminer si une classe a été compilée contre 1.0 ou 1.1. Tout d'abord, si la classe a été compilée par rapport à 1.1, elle aurait pu inclure une classe de bibliothèque 1.1 uniquement. Une fois que vous en avez trouvé une dans l'une des classes, vous pouvez sans risque conclure qu'il s'agit d'une classe compilée avec Java 1.1.

Notez que vous pouvez rechercher dans le pool de constantes au début de la classe pour déterminer les classes dans lesquelles le fichier de classe devra avoir toutes ses références externes entièrement résolues.

Il peut être fastidieux de rechercher des classes individuellement, heureusement beaucoup de paquets ont été ajoutés aussi. Les packages suivants sont spécifiques à Java 1.1, qui est qu'ils ne sont pas inclus dans 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 

De l'autre côté de la clôture, beaucoup d'appels aux méthodes suivantes suggèrent (mais ne sont pas la preuve réelle) que la code a été écrit contre Java 1.0, car ils ont été dépréciés dans Java 1.1 en raison de la nouvelle restructuration de l'événement 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. 

Il est possible de prouver que le code Java est la version 1.1, mais seulement dans certains cas (si le code utilise nouvellement ajouté 1.1 caractéristiques). Il est généralement impossible de prouver que le code Java était 1.0, mais l'absence de toute utilisation des fonctionnalités de Java 1.1, et l'utilisation massive des fonctionnalités dépréciées de Java allusion aux classes ciblées pour l'environnement Java 1.0.

Je ne connais aucun marquage en classe qui pourrait être en mesure de différencier les deux (différences dans les tableaux de numéros de lignes, etc.), principalement parce que je n'ai pas eu besoin de creuser les classes 1.0 et 1.1 dans un éditeur hexadécimal.

+0

Soit je ne comprends pas votre table, ou certaines de ces valeurs n'ont pas de sens, ou vous les avez transcrites incorrectement ... – Neil

+0

Neil a raison. 45 = 2d 46 = 2e Jetez un oeil à vos valeurs – RonK

+0

@Neil, désolé, je les ai transcrites incorrectement. Je vais les réparer maintenant. –

Questions connexes