gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:28 26 4
gpt4 key购买 nike

<分区>

考虑这个(恕我直言,很简单)的例子:

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。即使没有此信息,反编译器也应该能够反编译代码(不一定获得原始变量类型,但表现出相同的行为),尤其是因为许多混淆器也将其剥离。

反编译器出了什么问题:

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

在任何情况下,此代码都不会调用 String 重载,但反编译代码会调用。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com