web-dev-qa-db-fra.com

Choisissez et testez Java

Maintenant, j'essaie de trouver le meilleur décompilateur Java, j'ai trouvé ceux-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:

fleur de fougère:

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, j'ai écrit du code très simple. Que pensez-vous, quel code écrire pour tester les décompilateurs? Peut-être que l'idée est mieux qu'un essai {} catch () {} enfin {}?

41
user471011

Le code que vous utilisez pour tester doit tester les fonctionnalités disponibles dans JDK utilisées pour compiler la classe cible . Par exemple, si vous savez que votre cible est écrite en Java 1.5, il est raisonnable de supposer que le code peut inclure génériques , vous voudrez donc vous assurer que votre décompilateur choisi les gère correctement. D'après mon expérience, les décompilateurs librement disponibles ont tendance à être en retard sur les versions JDK en termes de fonctionnalités qu'ils prennent en charge par 1-2 versions.

Sur la base d'essais et d'erreurs personnels, JD a tendance à faire le meilleur travail en général. Cependant, si vous décompilez du code écrit en 1.3 ou inférieur, je vous suggère également d'essayer JODE .

EDIT, 5 ans plus tard:

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

25
Justin Garrick
10
Janus Troelsen

J'utilise http://Java.decompiler.free.fr/ depuis longtemps et je l'ai trouvé le meilleur. En particulier, je l'ai utilisé pour décompiler un pot tiers et j'ai également pu modifier le code source avec.

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

Mise à jour: Java Decompiler n'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é.

8
Anant

Il semble que fernflower et JD Java Decompiler produisent du code décompilé qui est aussi bon que possible pour ce cas de test particulier. Les deux autres ne sont pas ' t faire du bon travail, l'OMI.

Que pensez-vous, quel code écrire pour tester les décompilateurs?

  1. Écrivez du code plus compliqué en utilisant toutes les constructions disponibles.
  2. Essayez-les avec du vrai code.
  3. Essayez-les sur du vrai code qui a été obscurci.

Lorsque vous essayez du code que vous compilez à partir des sources, testez différentes options "-g" et différents compilateurs Java.

6
Stephen C

Si vous prévoyez d'obtenir des résultats significatifs, vous devriez vraiment tester avec un code un peu plus trivial. Fernflower a été créé dans le but de gérer un bytecode très inhabituel et obscurci. La décompilation de tels extraits simples n'est donc pas un problème. Soit dit en passant, si vous souhaitez tester la version autonome de Fernflower, envoyez-moi une note sur fernflower (dot) decompiler (at) gmail (dot) com. La version 0.8.4 est maintenant en version bêta semi-publique (mais n'est pas encore disponible sur le site Web).

6
Stiver

http://www.reversed-Java.com/fernflower/ , voir ma comparaison sur github.com/vorburger/ScratchApplet

5
vorburger

Pour plus d'informations, JD prend en charge les commutateurs (enum), switch (chaîne), assert et les boucles for-each.

À propos des options -g (javac),

  • si vous omettez les numéros de ligne, JD ne peut pas reconstruire le flux d'instructions d'origine: les types de boucle ne peuvent pas être déterminés, les affectations multiples ne peuvent pas être régénérées et l'algorithme utilisé pour réaligner le code source ne peut pas fonctionner.
  • si vous omettez les données des variables locales, JD ne peut pas, parfois, déterminer la plage exacte des variables. C'est problématique.
4
Emmanuel Dupuy

Ok, ceci est écrit depuis mon téléphone portable, alors restez avec moi.

Tout d'abord, chaque Java sont compilés en bytecode dans leur fichier . Class respectif. Cela signifie que les constantes sont stockées AS IS (d'où la possibilité de récupérer facilement les chaînes) et les variables sont affectées à un registre qui est ensuite placé sur une exécution de programme de pile lorsque la JVM traite le fichier de classe.

La raison pour laquelle votre bloc d'exception n'est pas renvoyé au code d'origine que vous avez écrit est à cause de la façon dont javac a compilé et traduit le code en Java bytecode.

Si vous voulez savoir quel décompilateur fonctionne le mieux, écrivez toutes les instructions Java bien connues (pour la boucle, l'instruction if, tandis que la boucle) avec quelques expressions et voyez ce qui représente le mieux votre code d'origine.

Bonne chance.

1
Buhake Sindi

Cela fait un moment que tout commentaire sur ce fil. Cependant, depuis que je l'ai trouvé et pris au sérieux l'entrée, je pense qu'il est important de donner une mise à jour.

J'ai utilisé Java Decompiler Free avec succès. Cependant, récemment, j'ai accidentellement supprimé pas mal de code d'une application de production J2EE. De plus, il y avait du code où il gérait complètement l'initialisation des variables.

Il n'y a peut-être rien qui puisse fonctionner correctement. Dans mon cas, c'est juste une autre leçon de sauvegarde, sauvegarde, sauvegarde. J'ai besoin d'un décompilateur qui gère correctement les génériques afin de faire une récupération de masse. Mais une certaine précision dans la gestion des variables serait également utile. C'est trop demander à un outil de cracher le code original. Mais ce que j'ai vu jusqu'à présent se compilera mais ne fonctionnera pas correctement, hormis les génériques. Donc je suppose que ça va être une longue semaine avant Noël !!

0
GISNovis