加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

是否有任何Java Decompiler可以正确地反编译对重载方法的调用?

发布时间:2020-12-14 05:51:04 所属栏目:Java 来源:网络整理
导读:考虑这个(恕我直言)简单的例子: public class DecompilerTest { public static void main(String[] args) { Object s1 = "The",s2 = "answer"; doPrint((Object) "You should know:"); for (int i = 0; i 2; i++) { doPrint(s1); doPrint(s2); s1 = "is"; s
考虑这个(恕我直言)简单的例子:
public class DecompilerTest {
    public static void main(String[] args) {
        Object s1 = "The",s2 = "answer";
        doPrint((Object) "You should know:");
        for (int i = 0; i < 2; i++) {
            doPrint(s1);
            doPrint(s2);
            s1 = "is";
            s2 = new Integer(42);
        }
        System.out.println();
    }

    private static void doPrint(String s1) {
        System.out.print("Wrong!");
    }

    private static void doPrint(Object s1) {
        System.out.print(s1 + " ");
    }
}

在没有调试信息的情况下用源/目标级别1.1编译它(即不应存在局部变量信息)并尝试对其进行反编译.我尝试了Jad,JD-GUI和Fernflower,他们都至少有一个错误的通话(即程序打印“错误!”至少一次)

真的没有java反编译器可以推断出正确的强制转换,以便它不会调用错误的重载吗?

编辑:目标级别1.1,以便不存在特定于Java6的快速验证信息.这可能会给反编译器一个线索,即s1已被声明为Object而不是String.即使没有这些信息,反编译器也应该能够反编译代码(不一定得到原始变量类型,但显示相同的行为),特别是因为许多混淆器也将它剥离.

反编译器出了什么问题:

>他们在第一次通话中错过了演员(对象).
>他们将s1的类型推断为String,但忘记在对doPrint的调用中添加强制转换(以便调用String版本而不是Object版本).
>一个糟糕的(我甚至没有列出)甚至将s2的类型推断为String,导致无法编译的代码.

在任何情况下,此代码从不调用String重载,但反编译的代码确实如此.

解决方法

Krakatau正确处理所有重载方法,甚至是在原始类型上重载的方法,大多数反编译器都会出错.它总是将参数强制转换为被调用方法的确切类型,因此代码可能比必要的更混乱,但至少它是正确的.

披露:我是Krakatau的作者.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读