Возникли проблемы с декомпиляцией * любого * класса с Jode - PullRequest
0 голосов
/ 11 октября 2009

Я смотрю на эту проблему часами. Любая помощь приветствуется.

Я написал код, использующий декомпилятор Jode, из "встроенного файла jar jode". Я хочу использовать эту версию, потому что она находится под лицензией Lesser GNU Public License.

Decompiler d = new Decompiler();
try {
    FileWriter fw = new FileWriter("c:\\jode.txt");

    d.setClassPath("C:\\mycode");

    ProgressListener p = new ProgressListener() {

        public void updateProgress(double arg0, String arg1) {
            System.out.println("inside of progress listener with arg0 = " +arg0+ " and arg1 = " +arg1);
        }
    };

    d.decompile("Test.class" , fw, p);

} catch (Exception ex) {
    ex.printStackTrace();
}

и я всегда получаю:

Exception in thread "main" java.lang.NoClassDefFoundError: Test.class
        at jode.bytecode.ClassInfo.loadInfo(ClassInfo.java:620)
        at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:86)
        at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:123)
        at jode.decompiler.Decompiler.decompile(Decompiler.java:191)
        at testdecompiler.Main.main(Main.java:45)

Если я использую

jode.decompiler.Main.decompile(...)

все работает - но я не могу использовать этот файл класса, потому что он находится в jode.jar, который является только GPL.

Ответы [ 4 ]

1 голос
/ 15 октября 2009

Мне удалось воспроизвести проблему со всеми различными двоичными версиями jode, которые доступны на их веб-сайте. Когда я собрал новую версию jode, используя основную линию из svn, она работала нормально. Я также видел запись на одном из форумов, где пользователь жаловался на проблему NoClassDefFound. Его случай звучал несколько иначе, но разработчик jode предложил использовать основную строку из svn вместо двоичного файла предварительной сборки.

0 голосов
/ 11 октября 2009

Обновление: мое первоначальное предположение было неверным, и, к сожалению, исходное исключение / сообщение выбрасывается, насколько я могу видеть. Код, в котором происходит сбой JODE, выглядит следующим образом:

 try {
      DataInputStream input = new DataInputStream
          (new BufferedInputStream
           (classpath.getFile(name.replace('.', '/') + ".class")));
        read(input, howMuch);            

  } catch (IOException ex) {
        String message = ex.getMessage();
      if ((howMuch & ~(FIELDS|METHODS|HIERARCHY
                       |INNERCLASSES|OUTERCLASSES)) != 0) {
          throw new NoClassDefFoundError(name);
        }

Поскольку для получения NoClassDefFound необходимо создать исключение IOException, проверьте все, что касается вашего подсистемы ввода-вывода, например, файл .encoding. Я полагаю, вам следует установить исправление JODE, чтобы получить подробное сообщение об ошибке или выполнить отладку.

0 голосов
/ 11 октября 2009

Это предположение, так как мне не нравятся декомпилируемые классы, но я думаю, что вы должны использовать

d.decompile("Test" , fw, p);

вместо того, что вы используете сейчас. Это может быть похоже на

Class.forName("ClassName")

без суффикса "class".

0 голосов
/ 11 октября 2009
d.setClassPath("C:\\mycode");

Этот classpath выглядит мне очень коротким.

...