给定方法名称和对象数组后,如何使用Java Reflections找到最佳匹配重载

Bra*_*one 6 java reflection java-8

我一直在用Java进行思考,遇到了一个相当难解决的问题。

仅给出方法的名称和的数组,Object如何找到该方法的最佳匹配重载?

我知道,在大多数情况下,只需检查参数列表的长度是否与数组的长度匹配,就可以快速排除许多重载。
接下来,我可以检查是否可以通过关联将数组的所有对象转换为期望的类型(我忘记了确切的方法名称,但是可以做到)。

但是,当多个方法与该过程匹配时,我遇到了一个问题。

假设我有以下两种方法:

public void doStuff(Collection<?> data) {
    // Do stuff
}

public void doStuff(List<?> data) {
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

如果我要传递一个具有单个Set (或其子类型)对象的数组,则可以轻松排除第二个重载。因为Sets不是的子接口/子类型List

ArrayList现在有了一个对象会很困难,因为an ArrayList既是a Collection 是a List
我知道如果我要使用常规代码,则编译器肯定会使用第二种方法,因为这是更好/更紧密的匹配。但是我该如何用反射做类似的事情?

我对各种解决方案都感兴趣,尽管我更喜欢使用JRE库,独立类或小型(单一用途)库的解决方案。
另外,我专门使用Java 8,尽管如果该语言的最新版本提供了更简单的方法来实现这一点,它们仍然非常受欢迎。