繁体   English   中英

如何在泛型中反编译桥接方法?

[英]How to decompile the bridge method in generics?

在《 Java核心技术第1卷》的通用部分中,作者提到了bridge方法的反编译结果。 但是,对jad,luyten和javap的主要测试没有得到与作者相同的结果。 我想知道如何通过反编译工具真正证明bridge方法的存在。 我的母语不是英语。 如果描述不清楚,请原谅。 相关代码和结果如下:

我尝试了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> {
}

我想在原书中得到相同的结果,我可以看到bridge方法的反编译结果。 javap反编译结果

您需要重写该方法,例如:

public class DateInterval extends Pair<LocalDate> {
    @Override
    public void setFirst(LocalDate first) {
        super.setFirst(first);
    }
}

Ideone演示

仅在需要时才合成“桥接方法”。 其主要目的是保持子类的多态性。 在您的示例中

public class DateInterval extends Pair<LocalDate> {
}

尽管您扩展了Pair<>类,但实际上并没有覆盖任何行为来实现多态。 将创建桥,以便在擦除类型后,覆盖的签名相同。 看这里

这就是原因,当按照shmosel的答案添加重写方法时,您会看到反编译时的bridge方法。

如果您没有任何重写的方法,则不需要桥接综合。 希望这能给您一个想法。

许多工具默认情况下会隐藏桥接方法,因为它们很少引起关注。

如果您想查看类文件中的真正内容,建议您使用Krakatau反汇编程序 您也可以尝试使用带有-p选项的javap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM