0

我已经盯着这个问题看了好几个小时了。任何帮助表示赞赏。

我编写了使用“嵌入式 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(...)

一切正常 - 但我不能使用这个类文件,因为它位于仅 GPL 的 jode.jar 中。

4

4 回答 4

1

我能够使用他们网站上提供的所有不同二进制版本的 jode 来重现该问题。当我使用 svn 的主线构建新版本的 jode 时,它​​运行良好。我还在其中一个用户抱怨 NoClassDefFound 问题的 jode 论坛中看到了一个条目。他的情况听起来略有不同,但 jode 开发人员建议他使用 svn 的主线而不是 prebuild 二进制文件。

于 2009-10-15T01:49:12.983 回答
0
d.setClassPath("C:\\mycode");

这个类路径对我来说看起来非常短。

于 2009-10-10T21:42:22.110 回答
0

更新:我最初的假设是错误的,糟糕的是,原始的异常/消息被丢弃了,就 ai 所见。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);
        }

由于必须抛出 IOException 才能获得 NoClassDefFound,因此请检查有关您的 IO 子系统的任何内容,例如 file.encoding。我想你应该修补 JODE 以获得详细的错误消息或调试到这一点。

于 2009-10-10T22:12:42.827 回答
0

这是一个猜测,因为我不喜欢反编译类,但我认为你应该使用

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

而不是你现在使用的。这可能类似于

Class.forName("ClassName")

没有“类”后缀。

于 2009-10-10T22:13:18.140 回答