在“Java核心技术第一卷”的通用部分,作者提到了桥方法的反编译结果。然而,jad、luyten和javap的主要测试并没有得到与作者相同的结果。我想知道如何通过反编译工具来真正证明桥方法的存在。我的母语不是英语。如果描述不清楚,请原谅。相关代码和结果如下:
我尝试过javap、jad和luyten这些反编译工具。
public class Pair<T> {
private T first;
private T second;
public Pair() {
}
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public void setFirst(T first) {
this.first = first;
}
public T getSecond() {
return second;
}
public void setSecond(T second) {
this.second = second;
}
}import java.time.LocalDate;
public class DateInterval extends Pair<LocalDate> {
}我想得到与原著相同的结果,我可以看到桥方法的反编译结果。decompile result by javap
发布于 2019-08-06 12:47:05
您需要覆盖该方法,例如:
public class DateInterval extends Pair<LocalDate> {
@Override
public void setFirst(LocalDate first) {
super.setFirst(first);
}
}发布于 2019-08-06 13:58:27
桥接方法只有在需要时才会被合成。它的主要目的是保持子类的多态特性。在您的示例中,
public class DateInterval extends Pair<LocalDate> {
}尽管您正在扩展类Pair<>,但您实际上并没有重写任何行为来实现多态性。桥被创建,因此在类型擦除之后,被覆盖的签名是相同的。See here
这就是原因,当你按照shmosel的回答添加重写方法时,你会看到反编译时的桥方法。
如果你没有任何被覆盖的方法,那么就不需要桥合成了。希望这篇文章能给你一些启发。
发布于 2019-08-06 12:38:51
许多工具默认情况下会隐藏桥方法,因为它们很少被关注。
如果您想查看类文件中的真实内容,我建议您使用Krakatau disassembler。您还可以使用-p选项来尝试javap。
https://stackoverflow.com/questions/57368804
复制相似问题