如何在Java中仅获取泛型接口实现类的目标实现方法
问题:如何获取泛型接口的实际实现方法
我定义了一个泛型接口和对应的实现类,代码如下:
import java.util.Arrays; interface Interface<T> { void doSomething(T element); } class StringImpl implements Interface<String> { @Override public void doSomething(String element) { System.out.println("StringImpl: doSomething"); } } public class Main { public static void main(String... args) { System.out.println(Arrays.toString(StringImpl.class.getDeclaredMethods())); } }
运行后输出了两个方法:
[public void com.ra.StringImpl.doSomething(java.lang.String), public void com.ra.StringImpl.doSomething(java.lang.Object)]
但我只想拿到实际实现的那个带String参数的方法,请问有没有便捷的方法实现这个需求?
解决方案
你遇到的这个问题是Java泛型类型擦除机制带来的典型现象——编译器会自动生成一个桥接方法(就是那个参数为Object的版本),用来保证泛型在运行时的类型兼容性。要过滤掉这个自动生成的方法,你可以直接使用Method类的isBridge()方法来判断:
修改后的Main类代码如下:
import java.util.Arrays; import java.util.stream.Collectors; interface Interface<T> { void doSomething(T element); } class StringImpl implements Interface<String> { @Override public void doSomething(String element) { System.out.println("StringImpl: doSomething"); } } public class Main { public static void main(String... args) { String result = Arrays.stream(StringImpl.class.getDeclaredMethods()) .filter(method -> !method.isBridge()) // 过滤掉编译器生成的桥接方法 .map(Object::toString) .collect(Collectors.joining(", ")); System.out.println(result); } }
运行后就只会输出你想要的方法:
public void com.ra.StringImpl.doSomething(java.lang.String)
简单说下原理:isBridge()方法是专门用来识别编译器生成的桥接方法的,这类方法并非你手动编写的实现,只是泛型类型擦除后JVM用来适配方法签名的“中间方法”,所以直接过滤掉就能得到你真正需要的实现方法了。
内容的提问来源于stack exchange,提问作者Ukonn Ra
相关产品推荐
相关产品推荐

