Qual a versão do .class?

tem como eu saber em qual versão eu compilei o meu codigo?
[]´s.

Olá

Anote a caneta na palma da mão! :lol:

Brincadeirinha, use o valor da propriedade java.class.version. Converta este valor para float.

JDK 1.1 --> 45.3
JDK 1.2 --> 46.0
JDK 1.3 --> 47.0
JDK 1.4 --> 48.0
JDK 1.5 --> 49.0

Teste você mesmo:

[code]
import java.util.Properties;

public class ClassVersion {
public static void main(String[] args) throws Exception {

   System.out.println(System.getProperty("java.class.version")); 
   System.out.println(System.getProperty("java.vendor")); 
   System.out.println(System.getProperty("java.vendor.url")); 
   System.out.println(System.getProperty("java.version")); 
             
}

}[/code]

Veja mais detalhes em The JavaTM Virtual Machine Specification, CHAPTER 4 The class File Format

[]s
Luca

Na verdade, isso retorna o maior número de versão do formato .class que a VM em execução consegue executar, ou seja, não tem nada a ver com a versão do .class sendo executado.

O jeito de ver isso seria usar algum editor de .class ou fazer um utilitário usando BCEL ou ASM pra extrair isso do bytecode.

Olá

Acho que não entenderam a brincadeira muito menos o link que passei… :cry:

[]s
Luca

Olá

Conforme reforcei no post anterior, a resposta da questão estava no link que postei. Mandei testar a propriedade da jvm para ficar claro que a resposta não serviria.

Bem, no link a gente lê que o número grande da versão está no oitavo byte do arquivo .class. Se pode testar isto com facilidade com um programinha como o seguinte que fiz também de brincadeira na hora do almoço:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author Luca
 *
 */
public class ClassVersion {

    public static void main(String[] args) {
        if (args.length != 1)     
            System.out.println("\nUso: ClassVersion qqcoisa.class");
        else {
            try {
	        System.out.println("\nVersao da classe = " + version(args[0]));
	    } catch (IOException ioe) {
	        ioe.printStackTrace();
	    }
        }
             
    }

    public static String version(String arq) throws IOException {
		/*
		 JDK 1.1 --> 45.3
		 JDK 1.2 --> 46.0
		 JDK 1.3 --> 47.0
		 JDK 1.4 --> 48.0
		 JDK 1.5 --> 49.0
		*/  
        InputStream is = new FileInputStream(new File(arq));
    
        byte[] bytes = new byte[8];
        is.read(bytes, 0, 8);
        is.close();

	 String versao = null;
	 switch (bytes[7]) {
	 case 45:
		versao = "1.1";
		break;
 	 case 46:
		versao = "1.2";
		break;
	 case 47:
		versao = "1.3";
		break;
	 case 48:
		versao = "1.4";
		break;
	 case 49:
		versao = "5.0";
		break;
	 case 50:
		versao = "Mustang?";
		break;			
	 }
        return versao;

    }

}

[]s
Luca

Olá

Há algo estranho com a classe que inclui no post anterior. Há uma máquina aqui que quando uso o j2sdk1.4.2_07 para compilar e não uso a opção -target 1.4 (ou 1.3), ela está colocando 0x1E no byte 8 e isto seria 46 = j2sdk 1.2. Não estou entendendo o porque e também não tenho tempo para verificar isto. Mas fica o alerta.

[]s
Luca