Strumento per la lettura e la visualizzazione di Java .versioni di classe

StackOverflow https://stackoverflow.com/questions/27065

  •  09-06-2019
  •  | 
  •  

Domanda

Qualcuno di voi conosce un programma che cerca .classe file e visualizzare il loro versioni compilate?

So che si può guardare a loro individualmente in un hex editor, ma ho un sacco di file di classe a guardare oltre (qualcosa nel mio gigante applicazione è la compilazione di Java6 per qualche motivo).

È stato utile?

Soluzione

Utilizzare il javap strumento che viene fornito con il JDK.Il -verbose opzione di stampa il numero di versione del file di classe.

> javap -verbose MyClass
Compiled from "MyClass.java"
public class MyClass
  SourceFile: "MyClass.java"
  minor version: 0
  major version: 46
...

Per mostrare solo la versione:

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

Altri suggerimenti

È abbastanza facile da leggere file di classe firma e per ottenere questi valori senza un 3rd party API.Tutto quello che dovete fare è leggere i primi 8 byte.

ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;

Per la classe di versione del file 51.0 (Java 7), l'apertura di byte sono:

CA FE BA BE 00 00 00 33

...dove 0xCAFEBABE, come per magia, byte, 0x0000 è la versione minore e 0x0033 è la versione principale.

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("invalid header");
      }
      int minor = data.readUnsignedShort();
      int major = data.readUnsignedShort();
      System.out.println(major + "." + minor);
    }
  }
}

A piedi directoryFile e degli archivi (File_jar alla ricerca del file di classe è banale.

Oracle Joe Darcy blog elenca i classe versione di JDK versione mapping fino a 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

Unix-like

file /path/to/Thing.class

Darà il tipo di file e la versione.Qui è l'aspetto dell'output:

Java compilato i dati della classe, versione 49.0

Se siete su un sistema unix si potrebbe fare solo un

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

(la mia versione del file dice "Java compilato i dati della classe, versione 50.0" per java6 classi).

Ancora un'altra versione di java per controllare

od -t d -j 7 -N 1 ApplicationContextProvider.class | head -1 | awk '{print "Java", $2 - 44}'

In eclipse se non si hanno i sorgenti collegate.Mente la prima riga dopo l'collegare pulsante di alimentazione.

// Compilato da CDestinoLog.java (versione 1.5 :49.0, super bit)

enter image description here

Forse questo aiuta qualcuno, troppo.Guarda non c'è modo più semplice per ottenere la versione di JAVA utilizzata per la compilazione e di costruire .classe.In questo modo è utile applicazione/classe di self check sulla versione di JAVA.

Sono andato attraverso JDK libreria e ho trovato questo utile costante:com.sole.distribuire.config.BuiltInProperties.CURRENT_VERSION.Non so fin quando si è in JAVA JDK.

Cercando questo pezzo di codice per la versione più costanti che ho ottenere il risultato seguente:

src:

System.out.println("JAVA DEV       ver.: " + com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION);
System.out.println("JAVA RUN     v. X.Y: " + System.getProperty("java.specification.version") );
System.out.println("JAVA RUN v. W.X.Y.Z: " + com.sun.deploy.config.Config.getJavaVersion() ); //_javaVersionProperty
System.out.println("JAVA RUN  full ver.: " + System.getProperty("java.runtime.version")  + " (may return unknown)" );
System.out.println("JAVA RUN       type: " + com.sun.deploy.config.Config.getJavaRuntimeNameProperty() );

output:

JAVA DEV       ver.: 1.8.0_77
JAVA RUN     v. X.Y: 1.8
JAVA RUN v. W.X.Y.Z: 1.8.0_91
JAVA RUN  full ver.: 1.8.0_91-b14 (may return unknown)
JAVA RUN       type: Java(TM) SE Runtime Environment

In classe bytecode non c'è davvero memorizzati costante - vedere marcati di rosso, parte del Principale.chiamata - costante memorizzata .classe bytecode

Costante è in classe utilizzata per controllare se la versione di JAVA non è aggiornato (vedi Come Java controlla che non è aggiornato)...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top