jvm bytecode - son - Herramienta para leer y visualizar versiones.class de Java
son los encargados de que los programas compilados en java corran en cualquier sistema operativo (7)
En Unix-like
file /path/to/Thing.class
Dará el tipo de archivo y la versión también. Así es como se ve el resultado:
datos compilados de la clase Java, versión 49.0
¿Alguno de ustedes conoce una herramienta que buscará archivos .class y luego mostrará sus versiones compiladas?
Sé que puedes verlos individualmente en un editor hexadecimal, pero tengo muchos archivos de clase para revisar (algo en mi aplicación gigante está compilando para Java6 por algún motivo).
Es bastante fácil leer la firma del archivo de clase y obtener estos valores sin una API de terceros. Todo lo que necesita hacer es leer los primeros 8 bytes.
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
Para la versión de archivo de clase 51.0 (Java 7), los bytes de apertura son:
CA FE BA BE 00 00 00 33
... donde 0xCAFEBABE son los bytes mágicos, 0x0000 es la versión menor y 0x0033 es la versión principal.
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);
}
}
}
Los directorios que caminan ( File ) y los archivos ( JarFile ) que buscan archivos de clase son triviales.
El blog de Joe , Joe Darcy, enumera la versión de la clase en mapeos de versiones de JDK hasta 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
Quizás esto ayude a alguien también. Parece que hay una forma más fácil de obtener la versión JAVA utilizada para compilar / construir .class. De esta manera es útil para la autocomprobación de clase / aplicación en la versión de JAVA.
He revisado la biblioteca JDK y he encontrado esta constante útil: com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION . No sé desde cuando está en JAVA JDK.
Al probar este fragmento de código para varias constantes de versión obtengo el resultado a continuación:
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() );
salida:
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
En el bytecode de la clase hay una constante realmente almacenada - vea la parte roja marcada de Main.call - constante almacenada en el bytecode de clase
Constante se usa en clase para comprobar si la versión de JAVA está desactualizada (consulte Cómo las comprobaciones de Java no están actualizadas ) ...
Si está en un sistema Unix, puede hacer una
find /target-folder -name /*.class | xargs file | grep "version 50/.0"
(mi versión del archivo dice "datos compilados de la clase Java, versión 50.0" para las clases java6).
Sin embargo, otra revisión de la versión java
od -t d -j 7 -N 1 ApplicationContextProvider.class | head -1 | awk ''{print "Java", $2 - 44}''
Use la herramienta javap que viene con el JDK. La opción -verbose
imprimirá el número de versión del archivo de clase.
> javap -verbose MyClass
Compiled from "MyClass.java"
public class MyClass
SourceFile: "MyClass.java"
minor version: 0
major version: 46
...
Para mostrar solo la versión:
WINDOWS> javap -verbose MyClass | find "version"
LINUX > javap -verbose MyClass | grep version