如何在Java中使用泛型接口,仅获取实现类中的方法

15

我有一个通用接口和实现它的类:

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个回答

27

过滤掉桥接方法

Method[] methods = Arrays.stream(StringImpl.class.getDeclaredMethods())
                         .filter(m -> !m.isBridge())
                         .toArray(Method[]::new);

4
我马上要回答的是 !m.isSynthetic,但这个更好。 - Mena
2
@Mena 是的,这样更好,不是所有的合成方法都是桥接的。 - Eugene
1
@Andrew 顺便说一下,编译器只会在两个地方创建桥接方法——协变返回类型和泛型。 - Eugene
1
@Andrew,我已经检查了接口(和抽象类)中方法的modifiers,它是0x1041 => [synthetic, volatile, public]。但在我看来,0x1401 => [synthetic, abstract, public] 更好。所以我想知道为什么使用volatile而不是abstract... - Ukonn Ra
1
@UkonnRa volatile 方法? - Eugene
2
@Eugene 实际上,这意味着“桥”。 “桥”和“易失性”都是0x40... 我明白了! - Ukonn Ra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接