Question

Maintenant, je suis en train de trouver le meilleur décompilateur java, je trouve celles-ci:

Avec ces décompilateurs je gère le code octet de cette classe:

public class ss
{
public static void main(String args[])
{
  try{
   System.out.println("try");

  }
  catch(Exception e)
  {
   System.out.println("catch");
  }
  finally
  {System.out.println("finally");}
}
}

et j'ai obtenu les résultats suivants:

fernflower:

public class ss {

   public static void main(String[] var0) {
      try {
         System.out.println("try");
      } catch (Exception var5) {
         System.out.println("catch");
      } finally {
         System.out.println("finally");
      }

   }
}

DJ Java Decompiler:

import java.io.PrintStream;

public class ss
{

    public ss()
    {
    }

    public static void main(String args[])
    {
        System.out.println("try");
        System.out.println("finally");
        break MISSING_BLOCK_LABEL_50;
        Exception exception;
        exception;
        System.out.println("catch");
        System.out.println("finally");
        break MISSING_BLOCK_LABEL_50;
        Exception exception1;
        exception1;
        System.out.println("finally");
        throw exception1;
    }
}

Cavaj:

import java.io.PrintStream;

public class ss
{

    public ss()
    {
    }

    public static void main(String args[])
    {
        System.out.println("try");
        System.out.println("finally");
        break MISSING_BLOCK_LABEL_50;
        Exception exception;
        exception;
        System.out.println("catch");
        System.out.println("finally");
        break MISSING_BLOCK_LABEL_50;
        Exception exception1;
        exception1;
        System.out.println("finally");
        throw exception1;
    }
}

http://java.decompiler.free.fr/ :

import java.io.PrintStream;
public class ss
{
  public static void main(String[] paramArrayOfString)
  {
    try
    {
      System.out.println("try");
    }
    catch (Exception localException)
    {
      System.out.println("catch");
    }
    finally {
      System.out.println("finally");
    }
  }
}

Je vois que le meilleur résultat en décompilateur: http://java.decompiler.free.fr/

Pour tester, je l'ai écrit un code très simple. Que pensez-vous, ce code pour écrire décompilateurs de test? Peut-être que l'idée est de mieux que d'essayer {} catch () {}} {enfin?

Était-ce utile?

La solution

Le code que vous utilisez pour test devrait tester les fonctionnalités disponibles dans le JDK utilisé pour compiler la classe cible . Par exemple, si vous savez que votre cible est écrit en Java 1.5, il est raisonnable de supposer que le code pourrait inclure JD a tendance à faire le meilleur travail en général. Toutefois, si vous le code décompilation qui a été écrit en 1.3 ou plus bas, je vous suggère aussi vous donner JODE essayer.

EDIT, 5 ans plus tard:

CFR , Procyon et Fernflower ouvrent la voie dans cet espace.

Autres conseils

J'utilise http://java.decompiler.free.fr/ pour depuis longtemps maintenant et trouvé qu'il était le meilleur. En particulier, j'utilisé pour décompiler un pot tiers et je suis en mesure de modifier le code source ainsi avec elle.

Il est facile à utiliser et l'interface utilisateur est également soignée et propre.

Mise à jour: Java Decompiler est plus disponible sur http://java.decompiler.free.fr/ . Il a un nouveau lien http://jd.benow.ca/ d'où il peut être téléchargé.

Si vous prévoyez d'obtenir des résultats significatifs, vous devriez vraiment tester avec un peu plus de code non trivial. Fernflower a été créé dans le but de traiter très inhabituel et obfuscation bytecode. décompilation Ainsi, ces extraits de simples est pas grand-chose. Soit dit en passant, si vous êtes intéressé à tester la version autonome de Fernflower-moi une note à fernflower (dot) décompilateur (at) gmail (dot) com. Version 0.8.4 est maintenant en version bêta semi-public (mais pas disponible sur le site Web encore).

Il ressemble à fernflower et JD Java Decompiler produisent le code décompilé qui est aussi bon que possible pour cette testcase particulier. Les deux autres ne font pas un bon travail, l'OMI.

  

Que pensez-vous, ce code à écrire à décompilateurs de test?

  1. Ecrire un code plus compliqué en utilisant toutes les constructions disponibles.
  2. Essayez-les sur un code réel.
  3. Essayez-les sur un code réel qui a été obscurcie.

Quand essayer le code que vous compilez de la source, l'expérience avec d'autres options "-g", et avec différents compilateurs Java.

http://www.reversed-java.com/fernflower/, voir mon comparaison sur github.com / Vorburger / ScratchApplet

Pour plus d'informations, JD supports commutateur (ENUM), commutateur (string), assert déclarations et pour chaque-boucles.

A propos des options -g (javac),

  • si vous omettez les numéros de ligne, peut JD pas reconstituer le flux original de Instructions: les types de boîte de boucle ne pas être déterminée, le multiple assigments ne peuvent pas être Régénérer et l'algorithme utilisé pour la source réalignement le code ne peut pas fonctionner.
  • si vous omettez le données variables locales, JD ne peut pas, parfois, déterminer la portée exacte des variables. Il est problématique.

Ok, cela est écrit à partir de mon téléphone portable pour garder avec moi.

1er de tous, tous les codes de fichiers Java sont compilés dans bytecode dans leurs pays respectifs .class fichier . Cela signifie que les constantes sont stockées AS IS (d'où les chaînes peuvent être facilement récupérées) et les variables sont affectées à un registre qui est ensuite mis sur l'exécution du programme de la pile lorsque le processus JVM le fichier de classe.

La raison pour laquelle votre bloc d'exception ne sont pas retournés au code original que vous avez écrit est à cause de la façon javac compilé et traduit le code Java bytecode.

Si vous voulez savoir qui décompilateur fonctionne le mieux, écrire toutes les déclarations java bien connus (boucle for, instruction if, while) avec quelques expressions et voir ce que représentent le mieux votre code d'origine.

Bonne chance.

Il a été un moment que tous les commentaires à ce fil. Cependant, depuis je l'ai trouvé et pris l'entrée au sérieux je pense qu'il est important de donner une mise à jour.

J'ai utilisé Java Decompiler gratuit avec succès. Cependant, récemment, je accidentellement supprimé un peu de code d'une application J2EE de production. supposé JD gratuit gérerait, mais il ne gère pas les médicaments génériques du tout. De plus il y avait un code où il a traité l'initialisation des variables totalement faux. Ce que j'ai fini avec était un désordre total.

Il ne peut pas être quelque chose là-bas qui le travail correctement. Dans mon cas, il est juste une autre leçon de sauvegarde, sauvegarde, sauvegarde. Je besoin d'un compilateur de génériques que les poignées correctement afin de faire une reprise de masse. Mais une certaine précision des variables de traitement serait également utile. Il est trop demander un outil de cracher sur le code original. Mais ce que je l'ai vu jusqu'à présent compilera mais ne fonctionnera pas correctement, les génériques de côté. Donc, je suppose que ça va être une semaine avant Noël !!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top