Возникли проблемы с декомпиляцией *любого* класса с помощью Jode.

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

  •  20-09-2019
  •  | 
  •  

Вопрос

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

Я написал код, который использует декомпилятор 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.

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

Решение

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

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

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

Этот путь к классам кажется мне ужасно коротким.

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

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

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

Class.forName("ClassName")

без суффикса «класс».

Обновлять:Мое первоначальное предположение было неверным, и, к сожалению, исходное исключение/сообщение, насколько я вижу, выброшено.Код, в котором 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, проверьте все, что касается вашей подсистемы ввода-вывода, например.файл.кодировка.Я думаю, вам следует исправить JODE, чтобы получить подробное сообщение об ошибке или выполнить отладку до этого момента.

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