Pergunta

Estou olhando para esta edição há horas. Qualquer ajuda é apreciada.

Eu escrevi código que usa o decompilador Jode do "arquivo jode jode incorporado". Quero usar esta versão porque está sob a licença pública menor da GNU.

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

E eu sempre entendo:

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)

Se eu usar

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

As coisas funcionam - mas não posso usar esse arquivo de classe porque reside no jode.jar que é apenas GPL.

Foi útil?

Solução

Consegui reproduzir o problema com todas as diferentes versões binárias do Jode disponíveis em seu site. Quando criei uma nova versão do Jode usando a linha principal do SVN, funcionou bem. Eu também vi uma entrada em um dos fóruns do Jode, onde um usuário estava reclamando do problema do NoclassDeffound. Seu caso parecia um pouco diferente, mas o desenvolvedor de Jode sugeriu que ele usasse a linha principal do SVN em vez do binário pré -construído.

Outras dicas

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

Esse caminho de classe parece muito curto para mim.

Isso é um palpite, pois não me imagino com aulas de descompilação, mas acho que você deveria usar

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

em vez do que você está usando agora. Isso pode ser semelhante a

Class.forName("ClassName")

sem o sufixo "classe".

ATUALIZAÇÃO: Minha suposição original estava errada e, para ruim, a exceção/ mensagem original é jogada fora, como a IA pode ver. O código em que Jode falha se parece com o seguinte:

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

Como uma ioexception deve ser jogada para obter o NoclassDeffound, verifique qualquer coisa sobre seu subsistema de IO, por exemplo, o arquivo.encoding. Eu acho que você deve corrigir o Jode para obter a mensagem de erro ou depuração detalhada até este ponto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top