使用 Jode 反编译*任何*类时遇到问题

发布于 2024-08-07 03:23:39 字数 1174 浏览 4 评论 0原文

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

我编写了使用“嵌入式 jode jar 文件”中的 Jode 反编译器的代码。我想使用这个版本,因为它遵循 Lesser 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.decompiler.Main.decompile(...)

东西可以工作 - 但我不能使用这个类文件,因为它驻留在仅是 GPL 的 jode.jar 中。

I've been staring at this issue for hours now. Any help is appreciated.

I wrote code that uses the Jode decompiler from the "embedded jode jar file". I want to use this version because it is under the 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();
}

and I always get :

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)

If I use

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

things work - but I can't use this class file because it resides in the jode.jar that is only GPL.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

撩动你心 2024-08-14 03:23:39

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

I was able to reproduce the problem with all of the different binary versions of jode that are available from their web site. When I built a new version of jode using the mainline from svn, it worked fine. I also saw an entry in one of the jode forums where a user was complaining about the NoClassDefFound problem. His case sounded slightly different, but the jode developer suggested that he use the mainline from svn instead of the prebuild binary.

故人爱我别走 2024-08-14 03:23:39
d.setClassPath("C:\\mycode");

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

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

This classpath looks awfully short to me.

怪我闹别瞎闹 2024-08-14 03:23:39

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

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

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

Class.forName("ClassName")

没有“class”后缀。

This is a guess, as i don't fancy myself with decompiling classes, but i think that u should use

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

instead of what u are using now. This could be similar to

Class.forName("ClassName")

without the "class" suffix.

请远离我 2024-08-14 03:23:39

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

Update: My original assumption was wrong, and to bad, the original exception/ message is thrown away, as far a i can see. The code where JODE fails looks like this:

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

Since an IOException has to be thrown to get the NoClassDefFound, check anything regarding your IO subsytsem, e.g. the file.encoding. I guess you should patch JODE to get the detailed error message or debug to this point.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文