(相关问题:支持goto的Java编译器或JVM语言?)
我已经反编译了一个jar(可能出于调试目的)并希望重新编译它。
我已经使用了JAD和JD,并且由于goto指令而无法编译
例如。
goto _L1
...
L1:
return true;
有没有简单的方法(或任何方法)来重新编译它? (除了手动重构和删除goto)
可以使用异常来实现goto,但这不是很漂亮。 这里还收集了其他一些作弊技巧:stackoverflow.com/questions/2430782/
将goto L1替换为return true;怎么样? :)
不,没有。在您的情况下,JD和JAD都无法正确地反编译类文件。" goto"语句是有关实际程序流程的提示。
您可以直接与Java Decompiler团队联系,发送一个类文件,在该文件中反编译会导致非法的源代码,并询问这是当前版本中的错误还是尚未实现的功能。
JAD是一个非常了不起的反编译器,JD ...在" try-catch-finally"语句中存在一些问题。
您是否尝试过Stiver的反编译器(http://www.reversed-java.com/fernflower)?
伊曼纽尔,法学博士的作者。
刚刚尝试过Emmanuels JD,作品就像一个魅力。
所有反编译器都在寻找与Java源构造相对应的代码模式,并选择最合适的源。
显然,您拥有的代码不符合JAD或JD中存储的任何模式,因此您将获得无法编译的Java源代码。这很可能是因为JAD几年未积极开发。
我建议您看一下Soot项目,该项目的反编译器更具攻击性。
http://www.sable.mcgill.ca/soot/
我会推荐一个现代的反编译器-如CFR或FernFlower!
我在线上发布了6个Java反编译器:Jadx,快速且具有Android支持,CFR(支持Java 8),JDCore(非常快),Procyon,Fernflower和JAD(非常快,但已过时)。
无需安装即可使用它们:http://www.javadecompilers.com/