Algum de vocês conhece uma ferramenta que pesquisa por arquivos .class e exibe suas versões compiladas?
Eu sei que você pode olhar para eles individualmente em um editor hexadecimal, mas eu tenho muitos arquivos de classe para examinar (algo em meu aplicativo gigante está compilando para Java6 por algum motivo).
jvm-bytecode
SCdF
fonte
fonte
Respostas:
Use a ferramenta javap que vem com o JDK. A
-verbose
opção imprimirá o número da versão do arquivo de classe.Para mostrar apenas a versão:
fonte
É fácil ler a assinatura do arquivo de classe e obter esses valores sem uma API de terceiros. Tudo que você precisa fazer é ler os primeiros 8 bytes.
Para a versão do arquivo de classe 51.0 (Java 7), os bytes de abertura são:
... onde 0xCAFEBABE são os bytes mágicos, 0x0000 é a versão secundária e 0x0033 é a versão principal.
Andar por diretórios ( Arquivo ) e arquivos ( JarFile ) procurando por arquivos de classe é trivial.
O blog de Joe Darcy da Oracle lista a versão da classe para os mapeamentos da versão JDK até Java 7:
fonte
No tipo Unix
Fornece também o tipo e a versão do arquivo. Esta é a aparência da saída:
fonte
Se você estiver em um sistema Unix, você pode simplesmente fazer um
(minha versão do arquivo diz "dados de classe Java compilados, versão 50.0" para classes java6).
fonte
file *.class
produz:ClassName.class: compiled Java class data, version 50.0 (Java 1.6)
Ainda outra verificação de versão java
fonte
Em eclipse, se você não tiver fontes anexadas. Cuidado com a primeira linha após o botão de anexar fonte.
// Compilado de CDestinoLog.java ( versão 1.5: 49.0, super bit )
fonte
Talvez isso ajude alguém também. Parece que há uma maneira mais fácil de usar a versão JAVA para compilar / construir .class. Esta forma é útil para a autoverificação do aplicativo / classe na versão JAVA.
Eu examinei a biblioteca JDK e encontrei esta constante útil: com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION . Não sei desde quando está em JAVA JDK.
Tentando este pedaço de código para várias constantes de versão, obtenho o resultado abaixo:
src:
resultado:
No bytecode da classe, há realmente uma constante armazenada - veja a parte marcada em vermelho de Main.call - constante armazenada no bytecode .class
Constante está na classe usada para verificar se a versão JAVA está desatualizada (veja Como o Java verifica se está desatualizada ) ...
fonte
Uma solução baseada em java usando números mágicos de versão . Abaixo, ele é usado pelo próprio programa para detectar sua versão de bytecode.
fonte
Esta classe Java verifica o conteúdo de todos os conteúdos WAR e JARs encontrados na lista de diretórios e imprime um resumo das versões do arquivo de classe java para cada componente, incluindo cada JAR dentro dos WARs:
fonte