Выберите и протестируйте декомпилятор Java [закрыто

StackOverflow https://stackoverflow.com/questions/3898391

  •  29-09-2019
  •  | 
  •  

Вопрос

Теперь я пытаюсь найти лучшего декомпилятора Java, я нашел это:

С этими декомпиляторами я обрабатываю байтовый код этого класса:

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");}
}
}

И я получил следующие результаты:

папоротник:

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 Decropiler:

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;
    }
}

Кавадж:

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");
    }
  }
}

Я вижу, что лучший результат в декомпиляторе: http://java.decompiler.free.fr/

Чтобы проверить, я написал очень простой код. Как вы думаете, какой код написать для тестирования декомпиляторов? Может быть, идея состоит в том, чтобы лучше, чем попытка {} catch () {} наконец {}?

Это было полезно?

Решение

Код, который вы используете для тестирования, должен Проверьте доступные функции IN JDK, используемый для компиляции целевого класса. Анкет Например, если вы знаете, что ваша цель написана на Java 1.5, разумно предположить, что код может включать дженерики, Так вы захотите убедиться, что выбранное вами декомпилятор обрабатывает их должным образом. По моему опыту, свободно доступные декомпиляторы, как правило, отстают от выпусков JDK с точки зрения функций, которые они поддерживают на 1-2 выпусках.

На основе личной проб и ошибок, JD имеет тенденцию делать лучшую работу в целом. Однако, если вы декомпилирующий код, который был написан в 1,3 или ниже, я также предложил бы вам дать Джод Попробуй.

Редактировать, 5 лет спустя:

CFR, Procyon, а также Папоротник провести путь в этом пространстве.

Другие советы

Я использовал http://java.decompiler.free.fr/ Долгое время и обнаружил, что это лучшее. В частности, я использовал его для декомпиляции сторонней банки, и я также смог изменить исходный код с ним.

Его прост в использовании, а пользовательский интерфейс также аккуратный и чистый.

ОБНОВЛЕНИЕ: Java Decropiler больше не доступен на http://java.decompiler.free.fr/. Анкет У него новая ссылка http://jd.benow.ca/ откуда это можно загрузить.

Если вы ожидаете получить какие-либо значимые результаты, вам действительно следует проверить с немного более нетривиальным кодом. Fernflower был создан с целью обработки очень необычного и запутанного байт -кода. Таким образом, разложение таких простых фрагментов не имеет большого значения. Кстати, если вы заинтересованы в тестировании автономной версии Fernflower, напишите мне примечание на декомпиляре (DOT) (AT) Gmail (DOT) Com. Версия 0.8.4 теперь находится в полупубличной бета-версии (хотя еще недоступна на веб-сайте).

Это выглядит как fernflower а также JD Java Decropiler производят декомпилированный код, который является настолько хорошим, насколько это возможно для этого конкретного испытательного прихода. Два других не делают хорошую работу, ИМО.

Как вы думаете, какой код написать для тестирования декомпиляторов?

  1. Напишите более сложный код, используя все доступные конструкции.
  2. Попробуйте их на какой -то настоящий код.
  3. Попробуйте их на какой -то настоящий код, который запутался.

При пробовании кода, который вы собираете из источника, экспериментируйте с различными вариантами «-g» и с разными компиляторами Java.

http://www.reversed-java.com/fernflower/, см. Мое сравнение на github.com /vorburger /scratchapplet

Для получения информации JD поддерживает Switch (enum), Switch (String), утверждения утверждения и за свои петли.

О вариантах -g (javac),

  • Если вы опустите номера строк, JD не может реконструировать исходный поток инструкций: типы цикла не могут быть определены, многочисленные исследования не могут быть регенерированы, а алгоритм, используемый для перестройки исходного кода, не может работать.
  • Если вы опустите данные локальной переменной, JD иногда не может определить точный диапазон переменных. Это проблематично.

Хорошо, это написано с моего мобильного телефона, так что терпите меня.

1 -е из всех, каждые коды файлов Java собираются в байт -коде в их соответствующем .учебный класс файл. Это означает, что константы хранятся AS IS (Следовательно, строки могут быть легко извлечены), а переменные назначаются в регистр, который затем помещается в выполнение программы стека, когда JVM обрабатывает файл класса.

Причина, по которой ваш блок исключений не возвращается в исходный код, который вы написали, связана с тем, как Javac составил и переведен код на Java Bytecode.

Если вы хотите знать, какой декомпилятор работает лучше всего, напишите все хорошо известные заявления Java (для цикла, если оператор IF, во время цикла) с некоторыми выражениями и посмотрите, что лучше всего представляет ваш исходный код.

Удачи.

Прошло много времени с момента любой обратной связи с этой темой. Однако с тех пор, как я нашел его и серьезно относился к входу, я чувствую, что важно дать обновление.

Я использовал Java Decropiler Free с хорошим успехом. Тем не менее, недавно я случайно удалил немало кода производственного приложения J2EE. Предполагается, что JD Free будет справляться с этим, но он вообще не обрабатывает дженерики. Кроме того, был код, где он обрабатывал инициализацию переменной совершенно неправильно. То, с чем я оказался, было полным беспорядком.

Там не может быть ничего, что будет правильно. В моем случае это просто еще один урок в резервной копии, резервной копии, резервной копии. Мне нужен дезаком, который правильно обрабатывает дженерики, чтобы сделать массовое восстановление. Но некоторая точность обработки переменных также поможет. Слишком много, чтобы спросить инструмент, чтобы выплюнуть исходный код. Но то, что я видел до сих пор, будет скомпилироваться, но не будет функционировать должным образом, дженерики в стороне. Так что я полагаю, что это будет долгая неделя до Рождества !!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top