如何在Java中使用通用接口获取实现类中的方法
Posted
技术标签:
【中文标题】如何在Java中使用通用接口获取实现类中的方法【英文标题】:How to just get the method in the implement class with a generic interface in Java 【发布时间】:2018-10-24 05:33:29 【问题描述】:我有一个通用接口和一个实现它的类:
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)]
但其实我只想要实现版本:
public void com.ra.StringImpl.doSomething(java.lang.String)
你有什么方便的方法来实现它吗?
【问题讨论】:
【参考方案1】:过滤掉bridge methods:
Method[] methods = Arrays.stream(StringImpl.class.getDeclaredMethods())
.filter(m -> !m.isBridge())
.toArray(Method[]::new);
【讨论】:
本来打算用!m.isSynthetic
回答,但这样更好。
@Mena 是的,这更好,不是所有的合成方法都是桥接方法
@Andrew 顺便说一句,编译器只有两个地方会创建桥接方法——协变返回类型和泛型
@Andrew 我已经检查了接口(和抽象类)中方法的modifiers
,它是 0x1041 => [synthetic, volatile, public]。但在我看来,0x1401 => [synthetic, abstract, public] 更好。所以我想知道为什么是volatile
而不是abstract
...
@Eugene 其实就是Bridge
的意思。 Bridge
和 Volatile
都是 0x40...我明白了!以上是关于如何在Java中使用通用接口获取实现类中的方法的主要内容,如果未能解决你的问题,请参考以下文章
java 中 如何将“一个类的方法 ”作为参数传到“另一个类的方法”中