Java 与Jode反编译*any*类时出现问题

Java 与Jode反编译*any*类时出现问题,java,decompiler,Java,Decompiler,我已经关注这个问题好几个小时了。感谢您的帮助 我编写了使用“嵌入式Jode jar文件”中的Jode反编译器的代码。我想使用这个版本,因为它是在较小的GNU公共许可下 Decompiler d = new Decompiler(); try { FileWriter fw = new FileWriter("c:\\jode.txt"); d.setClassPath("C:\\mycode"); ProgressListener p = new ProgressLi

我已经关注这个问题好几个小时了。感谢您的帮助

我编写了使用“嵌入式Jode jar文件”中的Jode反编译器的代码。我想使用这个版本,因为它是在较小的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();
}
我总是得到:

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.jar中,而jode.jar只是GPL

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

这个类路径对我来说太短了。

更新:我最初的假设是错误的,糟糕的是,我看到的原始异常/消息被丢弃了。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以获取详细的错误消息或调试到这一点

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

d.decompile("Test" , fw, p);
而不是你现在正在使用的。这可能类似于

Class.forName("ClassName")

没有“class”后缀。

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

我也运行了d.decompile(“Test”,fw,p),省略了.class,仍然失败。顺便说一句:Main.decompile根据系统属性设置类路径和引导类路径。也许Vladimir Dyuzhev将rt.jar添加到您的cp是正确的。嗨,Vladimir,是的,这不是类路径的真正价值,因为我不想在这里宣传它。我基本上将其设置为一个字符串,该字符串指向正在反编译的类文件的位置。对吗?我的意思是NoClassDefFound不是最顶级的。如果找不到您的类所依赖的类,您可以获得NoClassDefFound,尽管您的类位于类路径中。我认为,您的类路径至少应该包含JRE rt.jar。可能,我采用了我自己的流程类路径,附加了您的测试目录(根据Javadoc,分号分隔),并使用了该目录。我想我们在同一时间回答了同样的问题。那就是“删除“.class”后缀:-),我使用的是sourceforge中的jode-1.1-embedded.jar。我试图省略“.class”,并使用前斜杠(在windows中应该是:d.setClassPath(“C://mycode”);--仍然不起作用:(正如我在我的原始帖子的评论中指出的那样,我已经尝试过了,但它不起作用。有人自己尝试过吗?在不知道实现细节的情况下,很难给出答案,但问题肯定是你的“Test.class”“param不正确。正如@dz所建议的,您应该在jode.bytecode.ClassInfo.loadInfo()或jode.decompiler.decompiler.decompiler()进行进一步调查。”查看缺少的内容。是否可以调试?我似乎无法对其进行反编译。我有源代码和类文件,但当我进入反编译功能时,我不会跳转到任何源代码。我认为调试符号可能已被剥离?在上一条评论中更正,我似乎无法调试它。我相信Jad较新。至少我总是使用Jad。但是,这是一个C++应用程序,当然……你是如何从JN的页面上获取主线的,如果我遵循下面的文本链接:“你可以从CVS仓库获取最新的源代码。遵循那个页面上的指令;使用JoDE作为模块名。如果你想签出特定的版本,你可以使用-R选项:”,我基本上得到了一个404。转到sourceforge上的jode页面,单击Develop选项卡(或者直接转到可以找到svn信息的地方)。
Class.forName("ClassName")