如何在Java中使用通用接口获取实现类中的方法

Uko*_* Ra 15 java generics reflection interface

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

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()));
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是

[public void com.ra.StringImpl.doSomething(java.lang.String), 
public void com.ra.StringImpl.doSomething(java.lang.Object)]
Run Code Online (Sandbox Code Playgroud)

但实际上,我只想要实现版本:

public void com.ra.StringImpl.doSomething(java.lang.String)
Run Code Online (Sandbox Code Playgroud)

你有任何方便的方法来实现它吗?

And*_*lko 27

过滤掉桥接方法:

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

  • 即将回答`!m.isSynthetic`,但这更好. (4认同)
  • @Mena是的,这是更好的,并非所有合成方法都是桥梁 (2认同)
  • @Eugene实际上,这意味着`Bridge`.`Bridge`和`Volatile`都是0x40 ......我明白了! (2认同)