Pregunta

He estado mirando en este tema durante horas. Cualquier ayuda es apreciada.

he escrito código que utiliza el decompilador Jode del "archivo jar jode incrustado". Quiero usar esta versión, ya que se encuentra bajo la Licencia Pública GNU poca.

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

y siempre me sale:

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)

Si utilizo

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

cosas funcionan -. Pero no pueden utilizar este archivo de clase, ya que reside en el jode.jar que sólo es GPL

¿Fue útil?

Solución

Yo era capaz de reproducir el problema con todas las diferentes versiones binarias de jode que están disponibles en su sitio web. Cuando construí una nueva versión del jode usando la línea principal desde SVN, que funcionaba bien. También vi una entrada en uno de los foros Jode donde un usuario se quejaba por el problema noClassDefFound. Su caso sonaba un poco diferente, pero el desarrollador jode sugirió que utilizar la línea principal de SVN en lugar del binario prebuild.

Otros consejos

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

Esta ruta de clase ve muy corto para mí.

Esta es una suposición, ya que no me apetece a mí mismo con clases descompilación, pero creo que u debe utilizar

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

en lugar de lo que u está utilizando ahora. Esto podría ser similar a

Class.forName("ClassName")

sin el sufijo "clase".

Actualización: Mi hipótesis inicial era incorrecto, y al mal, a excepción / mensaje original se tira, por lo que puedo ver una. El código donde no JODE se ve así:

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

Desde una IOException tiene que ser lanzado para obtener el noClassDefFound, comprobar nada con respecto a su subsytsem IO, por ejemplo, la file.encoding. Creo que se debe parchear JODE hacer llegar el mensaje de error o de depuración detallada a este punto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top