【问题标题】:How to just get the method in the implement class with a generic interface in Java如何在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)

你有什么方便的方法来实现它吗?

【问题讨论】:

    标签: java generics reflection interface


    【解决方案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的意思。 BridgeVolatile 都是 0x40...我明白了!
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多