Detectar mediante programación Modo --preview en JRE

alfonx:

Desde Java 11, un PREVIA-MODE en el compilador de Java y de tiempo de ejecución se puede habilitar. Permite una vista previa de nuevas características. ( PEC 12 )

java --enable-preview

¿Cómo puedo detectar desde dentro de Java si la JVM se ha iniciado con previsualización en el modo activado?

La intención es describir el contenedor que se ejecuta en una página de estado-application / json - visión general de DevOps.

Hasta ahora he mirado en el sistema-propiedades y banderas, ni contenía una pista.

rmuller:

Puede comprobar el minor_version archivo de clase Java. Si 0xFFFFel archivo de clase es compilado con --enable-vista previa. Para más detalles, véase https://stackoverflow.com/a/58821511/868941 .

Un programa sencillo para comprobar esto se da a continuación (tenga cuidado, el código Java 13 con funciones de vista previa activado!).

public final class ClassFileVersion {

    private final int major;
    private final int minor;

    private ClassFileVersion(int major, int minor) {
        this.major = major;
        this.minor = minor;
    }

    public static ClassFileVersion of(Class<?> classFile) throws IOException {
        try (InputStream is = classFile.getResourceAsStream("/%s.class".formatted(classFile.getName().replace('.', '/')))) {
            var buffer = new byte[8];
            if (is.read(buffer) != buffer.length) {
                throw new AssertionError("Not a Java Class File!");
            }
            return new ClassFileVersion(readUnsignedShort(buffer, 6), readUnsignedShort(buffer, 4));
        }
    }

    public String getVersionNumber() {
        return "%d.%d".formatted(major, minor);
    }

    public boolean isEnablePreview() {
        return major >= 55 && minor == 0xFFFF;
    }

    @Override
    public String toString() {
        return (major < 49 ? "JDK " : "Java SE ") +
            switch(major) {
                case 45 -> "1.1";
                case 46 -> "1.2";
                case 47 -> "1.3";
                case 48 -> "1.4";
                case 49 -> "5";
                case 50 -> "6";
                case 51 -> "7";
                case 52 -> "8";
                case 53 -> "9";
                case 54 -> "10";
                case 55 -> "11";
                case 56 -> "12";
                case 57 -> "13";
                case 58 -> "14";
                default -> throw wrongVersion();
            } +
            switch(minor) {
                case 0 -> "";
                case 3 -> {
                    if (major != 45) {
                        throw wrongVersion();
                    }
                    yield "";
                }
                case 0xFFFF -> " --enable-preview";
                default -> throw wrongVersion();
            };
    }

    private static int readUnsignedShort(byte[] buffer, int offset) {
        return ((buffer[offset] & 0xff) << 8) + (buffer[++offset] & 0xff);
    }

    private AssertionError wrongVersion() {
        return new AssertionError("Wrong Java Class File Version: %d.%d".formatted(major, minor));
    }
    // to run this code (JDK 13 needed):
    // java --enable-preview --source 13 ClassFileVersion.java 
    public static void main(String[] args) throws IOException {
        // prints "Java SE 13 --enable-preview"
        System.out.println(ClassFileVersion.of(ClassFileVersion.class));
    }

}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=311702&siteId=1
Recomendado
Clasificación