Como posso abrir arquivos Java .class de maneira legível?

111

Estou tentando descobrir o que o arquivo de classe de um miniaplicativo Java está fazendo nos bastidores. Abri-lo com o Notepad ou Textpad mostra apenas um monte de gobbledy-gook.

Existe alguma maneira de colocá-lo de volta em um formato legível para que eu possa tentar descobrir o que ele está fazendo?

  • Ambiente == Windows com VS 2008 instalado.
cpuguru
fonte
7
Só uma questão de semântica, não deveria ser um = não dois? == é uma pergunta enquanto = é uma declaração e você está fazendo uma declaração sobre o seu ambiente.
icco
Você pode esclarecer esta questão? Meu pensamento imediato foi que você queria ler o bytecode real, mas parece que realmente deseja descompilar o código de outra pessoa.
Programador Outlaw
12
@icco, = significa atribuição, == significa igualdade. Ele está dizendo que (Environment == Windows c / VS2008 instalado) é verdadeiro, não dando ordem para definir o Ambiente para Windows c / VS2008 instalado. Homem que era offtopic e nerd.
Blorgbeard é lançado em
7
Para o registro == não declara igualdade; ele testa a igualdade. Você pode escrever verdadeiro == falso, e é tão significativo quanto escrever Ambiente == Windows com o VS 2008 instalado, ou seja, nada significativo.
bwerks

Respostas:

208

jd-gui é o melhor descompilador no momento. ele pode lidar com recursos mais novos em Java, em comparação ao JAD cada vez mais empoeirado.

DarenW
fonte
1
Até que ponto essa resposta está atualizada em 2020?
The Coding Wombat
Contanto que o link vá para algum lugar, acho que é bom. Eu não saberia se agora existe um descompilador Java melhor, já que não uso Java há muito tempo.
DarenW
77

Se você não se importa em ler o bytecode, o javap deve funcionar bem. Faz parte da instalação padrão do JDK.

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure
Michael Myers
fonte
9

Conforme apontado por @MichaelMyers, use

javap -c <name of java class file> 

para obter o código de montagem JVM. Você também pode redirecionar a saída para um arquivo de texto para melhor visibilidade.

javap -c <name of java class file> > decompiled.txt
Nilashish C
fonte
7

Você quer um descompilador java, você pode usar a ferramenta de linha de comando javappara fazer isso. Além disso, Java Decompiler HOW-TO descreve como você pode descompilar um arquivo de classe.

Drew Frezell
fonte
2

o que você está procurando é um descompilador java. Eu recomendo JAD http://www.kpdus.com/jad.html É gratuito para uso não comercial e faz o trabalho.

Observação: isso não tornará o código exatamente igual ao que foi escrito. ou seja, você perderá comentários e possivelmente nomes de variáveis, então será um pouco mais difícil do que apenas ler o código-fonte normal. Se o desenvolvedor for realmente reservado, ele terá ofuscado seu código também, tornando-o ainda mais difícil de ler.

David Beleznay
fonte
2

cpuguru, se seu miniaplicativo foi compilado com javac 1.3 (ou menos), sua melhor opção é usar Jad.

Infelizmente, o último JDK compatível com o JAD 1.5.8 (14 de abril de 2001) é o JDK 1.3.

Se seu miniaplicativo foi compilado com um compilador mais recente, você pode tentar JD-GUI : este descompilador está em desenvolvimento, no entanto, ele gera fontes Java corretas, na maioria das vezes, para classes compiladas com os JDKs 1.4, 1.5 ou 1.6.

DarenW, obrigado por sua postagem. JD-GUI não é o melhor descompilador ainda ... mas estou trabalhando em :)

Emmanuel Dupuy
fonte
2

Usar Jad para descompilar é provavelmente sua melhor opção. A menos que o código tenha sido ofuscado, ele produzirá um resultado correto.

Rasmus Faber
fonte
1

Você precisa usar um descompilador. Outros sugeriram JAD, existem outras opções, JAD é o melhor.

Vou repetir os comentários de que você pode perder um pouco em comparação com o código-fonte original. Vai parecer especialmente engraçado se o código usar genéricos, devido ao apagamento.

Zac Gochenour
fonte
1

Plugin JAD e / ou JADclipse Eclipse, com certeza.

John Gardner
fonte
1

Se o arquivo de classe que você deseja examinar for de código aberto, você não deve descompilá-lo, mas em vez disso, anexe os arquivos de origem diretamente em seu IDE. dessa forma, você pode apenas ver o código de alguma classe de biblioteca como se fosse o seu

Arturh
fonte
0

Como sugerido, você pode usar o JAD para descompilar e visualizar os arquivos. Para facilitar a leitura, você pode usar o plugin JADclipse para eclipse para integrar JAD diretamente ao eclipse ou usar DJ Java Decompiler, que é muito mais fácil de usar do que JAD de linha de comando


fonte
0

JAD é uma excelente opção se você deseja código Java legível como resultado. Se você realmente deseja se aprofundar no .classformato de arquivo, você vai querer javap. Ele vem junto com o JDK e permite que você "descompile" o bytecode hexadecimal em ASCII legível. A linguagem que ele produz ainda é bytecode (nada como Java), mas é bastante legível e extremamente instrutivo.

Além disso, se você realmente quiser, pode abrir qualquer .classarquivo em um editor hexadecimal e ler o bytecode diretamente. O resultado é idêntico ao de usar javap.

Daniel Spiewak
fonte
0

Não há necessidade de descompilar Applet.class. O código fonte das classes públicas da API Java vem com o JDK (se você optar por instalá-lo) e é mais legível do que o bytecode descompilado. Você pode encontrá-lo compactado em src.zip (localizado na pasta de instalação do JDK).

Arno
fonte