java.lang.Class::getDeclaredMethods文档特殊条款的技术疑问
为什么会出现仅返回类型不同的已声明方法?
Java源码层面确实不允许定义仅返回类型不同的方法,但这种场景在字节码层面是存在的,主要来自两个途径:
字节码直接生成:JVM的字节码格式并没有限制仅返回类型不同的方法。如果用ASM、Javassist这类字节码操作工具,直接修改或生成class文件,就能创建出这类绕过源码语法检查的方法。
编译器自动生成的特殊方法:最常见的就是泛型相关的桥接方法,还有其他合成方法:
比如泛型接口实现类,类型擦除后编译器会生成桥接方法:public interface GenericGetter<T> { T get(); } public class StringGetter implements GenericGetter<String> { @Override public String get() { return "hello"; } }类型擦除后,接口的方法会变成
Object get(),编译器会给StringGetter自动生成一个Object get()的桥接方法,这个方法内部调用String get()。此时这个类里就有两个参数完全相同、仅返回类型不同的get方法,都会被getDeclaredMethods返回。另外,内部类访问外部类私有成员时生成的桥接方法、Lambda相关的合成方法等,也可能出现这类仅返回类型不同的情况。
内容的提问来源于stack exchange,提问作者zombieParrot
相关产品推荐
相关产品推荐

