web-dev-qa-db-fra.com

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

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

Y a-t-il un moyen de le remettre dans un format quelque peu lisible afin que je puisse essayer de comprendre ce qu'il fait?

  • Environnement == Windows w/VS 2008 installé.
96
cpuguru

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

195
DarenW

Si cela ne vous dérange pas de lire le bytecode, javap devrait fonctionner correctement. Cela fait partie de l'installation standard du 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
68
Michael Myers

Vous voulez un décompilateur Java, vous pouvez utiliser l'outil de ligne de commande javap pour le faire. De plus, Java Decompiler HOW-TO décrit comment vous pouvez décompiler un fichier de classe.

7
Drew Frezell

Utiliser Jad pour le décompiler est probablement votre meilleure option. Si le code n'a pas été masqué, le résultat sera correct.

2
Rasmus Faber

ce que vous recherchez est un décompilateur Java. Je recommande JAD http://www.kpdus.com/jad.html Il est gratuit pour une utilisation non commerciale et fait le travail. 

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

2
David Beleznay

cpuguru, si votre applet a été compilé 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é avec un compilateur plus récent, vous pouvez essayer JD-GUI : ce décompilateur est en développement, il génère néanmoins 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 post. JD-GUI n'est pas encore le meilleur décompilateur ... mais je travaille sur :)

2
Emmanuel Dupuy

Si le fichier de classe que vous souhaitez explorer est un code source ouvert, vous ne devez pas le décompiler, mais attachez-le directement aux fichiers source 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 votre propre

1
arturh

C'est du code compilé, vous devrez utiliser un décompilateur comme JAD: http://www.kpdus.com/jad.html

1
cynicalman

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

Je ferai écho aux commentaires que vous pourriez perdre un peu par rapport au code source d'origine. Cela va paraître particulièrement amusant si le code utilise des génériques, à cause de l'effacement.

1
Zac Gochenour

Comme l'a souligné @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
1
Nilashish C

jd-gui " http://code.google.com/p/innlab/downloads/detail?name=jd-gui-0.3.3.windows.Zip&can=2&q= " est la meilleure option pour l'utilisateur pour décompiler le fichier .class ....

1

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

1
John Gardner

vous pouvez également utiliser les décompilateurs Java en ligne disponibles. Par exemple http://www.javadecompilers.com

0
Prachi Sharma

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

0
Arno

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 directement JAD à Eclipse ou utiliser DJ Java Decompiler, qui est beaucoup plus simple à utiliser que JAD en ligne de commande.

0
amitwadhwa

JAD est une excellente option si vous souhaitez obtenir un code Java lisible. Si vous voulez vraiment creuser dans les éléments internes du format de fichier .class, vous allez vouloir 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 du bytecode (différent de Java), mais il est assez lisible et extrêmement instructif.

De plus, si vous voulez {vraiment} _, vous pouvez ouvrir n’importe quel fichier .class dans un éditeur hexadécimal et lire le bytecode directement. Le résultat est identique à l'utilisation de javap.

0
Daniel Spiewak

CFR - un autre décompilateur Java est un excellent décompilateur pour Java moderne écrit en Java 6.

0
tidbeck