如何在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的意思。 BridgeVolatile 都是 0x40...我明白了!

以上是关于如何在Java中使用通用接口获取实现类中的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java类中定义接口属性并如何使用接口的方法

java 中 如何将“一个类的方法 ”作为参数传到“另一个类的方法”中

Flutter/Dart - Dart中的抽象类 多态 和接口

Java 线程安全问题

Java静态方法获取所属类的信息

如何在Java类中定义接口属性并如何使用