我几个小时以来一直在盯着这个问题。任何帮助表示赞赏。
我编写的代码使用了“嵌入式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.decompiler.Main.decompile(...)
事情有效 - 但我不能使用这个类文件,因为它驻留在只有GPL的jode.jar中。
答案 0 :(得分:1)
我能够通过他们的网站上提供的所有不同二进制版本的jode重现该问题。当我使用svn的主线构建新版本的jode时,它运行正常。我还在其中一个jode论坛中看到一个用户抱怨NoClassDefFound问题的条目。他的案例听起来略有不同,但是jode开发人员建议他使用svn中的mainline而不是prebuild二进制文件。
答案 1 :(得分:0)
d.setClassPath("C:\\mycode");
这个类路径看起来非常短暂。
答案 2 :(得分:0)
更新:我原来的假设是错误的,而且糟糕的是,原来的异常/消息被抛弃了,我可以看到。 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 subsytsem的任何内容,例如: file.encoding。我想你应该修补JODE来获取详细的错误信息或调试到这一点。
答案 3 :(得分:0)
这是猜测,因为我不喜欢反编译类,但我认为你应该使用
d.decompile("Test" , fw, p);
而不是你现在使用的。这可能类似于
Class.forName("ClassName")
没有“class”后缀。