tabla son sistema que programas programacion operativo los encargados ejemplos eficiente cualquier cual corran compilados compilador codigo jvm-bytecode

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).


En eclipse si no tienes fuentes adjuntas. Tenga en cuenta la primera línea después de adjuntar el botón de fuente.

// Compilado de CDestinoLog.java ( versión 1.5: 49.0, super bit )


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