2009-10-12 5 views
15

Je suis souvent coincé avec un fichier de classe java sans source et j'essaie de comprendre le problème que j'ai à portée de main.Comprendre le code Java Byte

Remarque un décompilateur est utile mais ne suffit pas dans toutes les situations ...

J'ai deux questions

  1. Quels sont les outils disponibles pour voir le code octet java (de préférence disponible à partir de la ligne de commande linux)
  2. Quelles sont les bonnes références pour se familiariser avec le code octet Java syntaxe

Répondre

16

plutôt que de regarder directement le bytecode Java, qui w Si vous avez besoin de familiarité avec la machine virtuelle Java et ses opérations, vous pouvez essayer d'utiliser un utilitaire de décompilation Java. Un décompilateur tentera de créer un fichier source java à partir du fichier class spécifié.

Le How do I “decompile” Java class files? est une question connexe qui serait instructif pour savoir comment décompiler les fichiers Java class. Cela dit, on peut utiliser la commande javap qui fait partie du JDK pour désassembler les fichiers Java class. La sortie de javap sera le bytecode Java contenu dans les fichiers class. Mais soyez averti que le bytecode ne ressemble pas du tout au code source Java.

La source précise pour l'apprentissage sur le bytecode Java et la machine virtuelle Java lui-même serait The Java Virtual Machine Specification, Second Edition. En particulier, Chapter 6: The Java Virtual Machine Instruction Set a un index de toutes les instructions de bytecode.

+0

voir mon commentaire concernant decompiler, – hhafez

+0

@hhafez: Je suppose que vous répondez "Comprendre le code Java Byte", n'est-ce pas? –

1

Si vous avez une classe et pas de code source, mais vous avez un bug, vous pouvez faire l'une des deux choses fondamentales:

  1. décompiler, corriger le bug et recréer le fichier jar. Je l'ai déjà fait auparavant, mais les administrateurs système se méfient de la mise en production.
  2. tests unitaires d'écriture pour la classe, déterminer ce qui cause le bug, le rapport bug avec les tests unitaires et d'attendre qu'il soit fixé.

    (2) est généralement celle qui sysadmins, dans mon expérience, préfèrent. Si vous allez avec (2) alors, entre-temps, puisque vous savez ce qui cause le bug, vous pouvez soit ne pas permettre à cette entrée d'aller à la classe, pour éviter un problème, ou être prêt à le gérer correctement quand l'erreur arrive.

    Vous pouvez également utiliser AspectJ pour injecter du code dans la classe de problème et changer le comportement de la méthode sans réellement recompiler. Je pense que cela peut être l'option préférable, car vous pouvez le changer pour tout le code qui peut appeler la fonction, sans vous soucier d'enseigner à tous le problème.

    Si vous apprenez à lire les instructions de bytecode, qu'allez-vous faire pour résoudre le problème?

+0

1. Je ne savais pas que vous pourriez utiliser AspectJ pour insérer du code dans .class, je pensais que cela a fonctionné sur le Java, mais je suppose que je me trompe 2. Que vais-je faire quand je trouve le problème? Plusieurs fois, trouver le problème est à mi-chemin pour résoudre votre problème – hhafez

+0

@hhafez - Vous pouvez faire le tissage à l'exécution des aspects dans les classes, mais, vous pouvez violer la licence lorsque vous faites cela, alors soyez juste un peu prudent. Les tests unitaires peuvent être votre meilleur pari, mais si le code n'est pas testable alors la décompilation devient une option, mais c'est un processus lent, OMI. –

0

J'ai deux questions

1) Quels sont les outils disponibles pour voir le code octet java (de préférence disponible à partir de la ligne de commande linux)

L'outil javap (avec -c option) va désassembler un fichier bytecode. Il s'exécute à partir de la ligne de commande et est fourni dans le cadre du Java SDK.

2) Quelles sont les bonnes références pour se familiariser avec le code octet Java syntaxe

L'outil javap utilise la même syntaxe que celle utilisée dans la spécification JVM, et la spécification JVM est naturellement la source définitive . J'ai également vu "Inside the Java Virtual Machine" par Bill Venners. Je ne l'ai jamais lu, et il semble qu'il pourrait être épuisé. La syntaxe réelle (textuelle) est simple et explicite ... en supposant que vous ayez une référence qui explique ce que font les bytecodes, et que vous êtes modérément familier avec la lecture de code à ce niveau. Mais il sera probablement plus facile de lire la sortie d'un décompilateur, même si les bytecodes ont été alimentés par un obfuscator.

14

Pour afficher l'instruction bytecode des fichiers de classe, utilisez la commande javap -v, de la même manière que si vous exécutez un programme Java, en spécifiant classpath (si nécessaire) et le nom de la classe.

Exemple:

javap -v com.company.package.MainClass 

A propos du jeu d'instructions de bytecode, Instruction Set Summary

+1

Cette réponse couvre complètement les deux aspects de la question originale. – CyberMJ

2

Fernflower est un décompilateur analytique, donc il décompiler les classes à un code java lisible au lieu de bytecode. C'est beaucoup plus utile lorsque vous voulez comprendre comment le code fonctionne.