Comment puis-je ouvrir des fichiers Java .class d'une manière lisible par l'homme?

111

J'essaie de comprendre ce que fait le fichier de classe d'une applet Java sous le capot. L'ouvrir avec Notepad ou Textpad montre juste un tas de gobbledy-gook.

Existe-t-il un moyen de le remettre dans un format assez lisible afin que je puisse essayer de comprendre ce qu'il fait?

  • Environnement == Windows avec VS 2008 installé.
cpuguru
la source
7
Juste une chose de sémantique, ne devrait-il pas être un = pas deux? == est une question tandis que = est une déclaration et vous faites une déclaration sur votre environnement.
icco
Pouvez-vous clarifier cette question? Ma pensée immédiate était que vous vouliez lire le bytecode réel, mais il semble que vous vouliez réellement décompiler le code de quelqu'un d'autre.
Programmeur hors
12
@icco, = signifie affectation, == signifie égalité. Il dit que (Environnement == Windows avec VS2008 installé) est vrai, ne donnant pas d'ordre pour définir l'environnement sur Windows avec VS2008 installé. Homme qui était hors-sujet et ringard.
Blorgbeard sort le
7
Pour mémoire == ne déclare pas l'égalité; il teste l'égalité. Vous pouvez écrire true == false, et c'est à peu près aussi significatif que d'écrire Environment == Windows avec VS 2008 installé, c'est-à-dire pas significatif du tout.
bwerks

Réponses:

208

jd-gui est le meilleur décompilateur du moment. il peut gérer les nouvelles fonctionnalités de Java, par rapport au JAD poussiéreux.

DarenW
la source
1
Dans quelle mesure cette réponse est-elle à jour en 2020?
The Coding Wombat
Tant que le lien va quelque part, je suppose que c'est bon. Je ne saurais pas s'il existe maintenant un meilleur décompilateur Java, car je n'ai pas utilisé Java depuis longtemps.
DarenW
77

Si cela ne vous dérange pas de lire le bytecode, javap devrait fonctionner correctement. Cela fait partie de l'installation JDK standard.

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
la source
9

Comme indiqué par @MichaelMyers, utilisez

javap -c <name of java class file> 

pour obtenir le code d'assemblage JVM. Vous pouvez également rediriger la sortie vers un fichier texte pour une meilleure visibilité.

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

Vous voulez un décompilateur java, vous pouvez utiliser l'outil de ligne de commande javappour ce faire. En outre, Java Decompiler HOW-TO décrit comment vous pouvez décompiler un fichier de classe.

Drew Frezell
la source
2

ce que vous recherchez est un décompilateur java. Je recommande JAD http://www.kpdus.com/jad.html C'est gratuit pour un usage non commercial et fait le travail.

Remarque: cela ne rendra pas le code exactement identique à ce qui a été écrit. c'est-à-dire que vous allez perdre des commentaires et éventuellement des noms de variables, donc ça va être un peu plus difficile que de simplement lire le code source normal. Si le développeur est vraiment secret, il aura également obscurci son code, ce qui le rendra encore plus difficile à lire.

David Beleznay
la source
2

cpuguru, si votre applet a été compilée avec javac 1.3 (ou moins), votre meilleure option est d'utiliser Jad.

Malheureusement, le dernier JDK pris en charge par JAD 1.5.8 (14 avril 2001) est JDK 1.3.

Si votre applet a été compilée avec un compilateur plus récent, vous pouvez essayer JD-GUI : ce décompilateur est en cours de développement, néanmoins, il génère des sources Java correctes, la plupart du temps, pour les classes compilées avec les JDK 1.4, 1.5 ou 1.6.

DarenW, merci pour votre message. JD-GUI n'est pas encore le meilleur décompilateur ... mais je travaille dessus :)

Emmanuel Dupuy
la source
2

Utiliser Jad pour le décompiler est probablement votre meilleure option. À moins que le code n'ait été obscurci, il produira un résultat correct.

Rasmus Faber
la source
1

Vous devez utiliser un décompilateur. D'autres ont suggéré JAD, il y a d'autres options, JAD est la meilleure.

Je ferai écho aux commentaires que vous risquez de perdre un peu par rapport au code source d'origine. Cela aura l'air particulièrement amusant si le code utilisait des génériques, en raison de l'effacement.

Zac Gochenour
la source
1

Plugin JAD et / ou JADclipse Eclipse, bien sûr.

John Gardner
la source
1

Si le fichier de classe que vous souhaitez consulter est open source, vous ne devez pas le décompiler, mais plutôt attacher les fichiers source directement dans votre IDE. de cette façon, vous pouvez simplement afficher le code d'une classe de bibliothèque comme s'il s'agissait de la vôtre

Arturh
la source
0

Comme suggéré, vous pouvez utiliser JAD pour le décompiler et afficher les fichiers. Pour faciliter la lecture, vous pouvez utiliser le plugin JADclipse pour eclipse pour intégrer JAD directement à eclipse ou utiliser DJ Java Decompiler qui est beaucoup plus facile à utiliser que la ligne de commande JAD


la source
0

JAD est une excellente option si vous voulez du code Java lisible en conséquence. Si vous voulez vraiment creuser dans les éléments internes du .classformat de fichier, vous le voudrez javap. Il est fourni avec le JDK et vous permet de "décompiler" le bytecode hexadécimal en ASCII lisible. Le langage qu'il produit est toujours le bytecode (pas quelque chose comme Java), mais il est assez lisible et extrêmement instructif.

De plus, si vous le souhaitez vraiment , vous pouvez ouvrir n'importe quel .classfichier dans un éditeur hexadécimal et lire directement le bytecode. Le résultat est identique à l'utilisation javap.

Daniel Spiewak
la source
0

Il n'est pas nécessaire de décompiler Applet.class. Le code source des classes API Java publiques est fourni avec le JDK (si vous choisissez de l'installer) et est mieux lisible que le bytecode décompilé. Vous pouvez trouver compressé dans src.zip (situé dans votre dossier d'installation JDK).

Arno
la source