128 votes

Outil pour lire et afficher les versions de classe Java.

Est-ce que l'un d'entre vous connaît un outil qui recherchera les fichiers .class et affichera ensuite leurs versions compilées ?

Je sais que vous pouvez les regarder individuellement dans un éditeur hexadécimal mais j'ai beaucoup de fichiers .class à examiner (quelque chose dans mon application géante se compile en Java6 pour une raison quelconque).

1 votes

Plus populaire en double stackoverflow.com/questions/1096148/… a dans sa réponse certains outils pratiques non mentionnés ici.

153voto

staffan Points 3299

Utilisez l'outil javap fourni avec le JDK. L'option -verbose affichera le numéro de version du fichier de classe.

> javap -verbose MyClass
Compilé à partir de "MyClass.java"
public class MyClass
  Fichier source: "MyClass.java"
  version mineure: 0
  version majeure: 46
...

Pour afficher seulement la version:

WINDOWS> javap -verbose MyClass | find "version"
LINUX  > javap -verbose MyClass | grep version

5 votes

Version major.minor=JDK/JavaSE; 45.3=JDK1.1; 46.0=JDK1.2; 47.0=JDK1.3; 48.0=JDK1.4; 49.0=JavaSE5(1.5); 51.0=JavaSE7(1.7); 50.0=JavaSE6(1.6); 52.0=JavaSE8(1.8); 53.0=JavaSE9; 54.0=JavaSE10; 55.0=JavaSE11; 56.0=JavaSE12; 57.0=JavaSE13; 58.0=JavaSE14;

0 votes

Od est 3 ordres de grandeur plus rapide que javap donc pour le scripting utilisez od. stackoverflow.com/a/25201428/1133275

50voto

McDowell Points 62645

Il est assez facile de lire la signature des fichiers de classe et d'obtenir ces valeurs sans utiliser une API tierce. Tout ce que vous avez à faire est de lire les 8 premiers octets.

ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;

Pour la version du fichier de classe 51.0 (Java 7), les octets d'ouverture sont :

CA FE BA BE 00 00 00 33

...où 0xCAFEBABE sont les octets magiques, 0x0000 est la version mineure et 0x0033 est la version majeure.

import java.io.*;

public class Demo {
  public static void main(String[] args) throws IOException {
    ClassLoader loader = Demo.class.getClassLoader();
    try (InputStream in = loader.getResourceAsStream("Demo.class");
        DataInputStream data = new DataInputStream(in)) {
      if (0xCAFEBABE != data.readInt()) {
        throw new IOException("entête invalide");
      }
      int minor = data.readUnsignedShort();
      int major = data.readUnsignedShort();
      System.out.println(major + "." + minor);
    }
  }
}

Parcourir les répertoires (File) et les archives (JarFile) à la recherche de fichiers de classe est trivial.

Le blog de Joe Darcy chez Oracle répertorie les correspondances entre la version de classe et la version JDK jusqu'à Java 7 :

Target   Major.minor Hex
1.1      45.3        0x2D
1.2      46.0        0x2E
1.3      47.0        0x2F
1.4      48.0        0x30
5 (1.5)  49.0        0x31
6 (1.6)  50.0        0x32
7 (1.7)  51.0        0x33
8 (1.8)  52.0        0x34
9        53.0        0x35

0 votes

Aussi, n'oubliez pas que assert est seulement exécuté s'il est activé lors du lancement de java, donc vous pourriez lire des fichiers indésirables si vous n'utilisez pas IllegalArgumentException (par exemple)

25voto

phunehehe Points 2806

Sous Unix-like

fichier /chemin/vers/Thing.class

Donnera le type de fichier et la version également. Voici à quoi ressemble la sortie :

données de classe Java compilées, version 49.0

0 votes

(simplifié à partir de la réponse de WMR)

0 votes

Ceci est bien plus simple que les autres solutions

0 votes

J'allais commenter ma réponse: od --endian=big -An -j6 -N2 -t u2 MonFichier.class (pour lire 2 octets, numéros 7 et 8, après avoir sauté les 6 premiers et l'afficher en décimal big-endian), mais votre réponse est beaucoup plus élégante, et inclut la version mineure, si disponible, et c'est presque aussi rapide.

9voto

WMR Points 5869

Si vous êtes sur un système Unix, vous pourriez simplement faire un

find /dossier-cible -name \*.class | xargs file | grep "version 50\.0"

(ma version de file indique "données de classe Java compilée, version 50.0" pour les classes Java6).

0 votes

Sur macOS (au moins 10.12.6), la sortie est encore plus utile : file *.class produit : ClassName.class : données de classe Java compilées, version 50.0 (Java 1.6)

0voto

Ryan Guest Points 2262

Je recommande: DJ Java Decompiler. C'est gratuit à essayer et coûte $19.99 pour l'achat.

J'ai aussi entendu de bonnes choses sur Cavaj, mais je ne l'ai jamais utilisé personnellement. C'est gratuit, donc ça vaut vraiment la peine d'essayer.

En ce qui concerne la recherche des fichiers, je l'ai intégré à ma configuration eclipse. Avec ma configuration, quand je clique sur un fichier .java il s'ouvre dans eclipse, et quand je clique sur un fichier .class, il s'ouvre dans DJ Java Decompiler.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X