实现接口的给定类的getDeclaredMethods为什么会给出更多结果?

时间:2015-05-21 13:55:13

标签: spring reflection groovy

我的Spring应用程序中有这个Groovy代码段

 Class.forName(com.example.Name).getDeclaredMethods().each { method ->
                if (method.getName() == ('findId')) {
                    println method.returnType.name
                    println method.getName()
                }
            }

和界面:

public interface Find<E, D> {
    E findId(D id);
}

和班级:

class Name implements Find<MyType,String>{
...
}

当我的代码snipet被执行时,我希望只有一个返回类型MyType的方法,但我有2个?

类com.example.MyType with method findId

使用方法 findId

类java.lang.Object

这个发现可以来自哪里?从界面还是从Spring? (我没有使用returnedType对象定义方法findID(我确定)。

和getDeclaredMethods()的文档

  

返回反映所有内容的{@code Method}对象数组        *由此类或由此表示的接口声明的方法        * {@code Class}对象。这包括公共,受保护,默认        *(包)访问和私有方法,但不包括继承的方法。        *返回的数组中的元素没有排序,也没有排序        *特别订单。如果是类,此方法返回长度为0的数组        *或接口声明没有方法,或者这个{@code Class}对象        *表示基本类型,数组类或void。班级        *初始化方法{@code}不包括在内        *返回数组。如果类声明了多个公共成员方法        *具有相同的参数类型,它们都包含在返回的中        *数组。

1 个答案:

答案 0 :(得分:2)

这是因为E泛型类型和类型擦除。通用类型在字节代码中替换为Object

如果您查看this example,就会看到

private X first; 
private Y second; 
public X getFirst() { return first; } 
public Y getSecond() { return second; } 

在类型擦除后转向此

private Object first; 
private Object second; 
public Object getFirst() { return first; } 
public Object getSecond() { return second; } 

您在旁边看到其他方法的原因是因为编译器添加了合成bridge method

引用与上面的例子相关:

  

NumericValue类在类型擦除后实现非通用的Comparable接口,编译器添加了一个所谓的桥接方法。需要桥接方法,以便类NumericValue仍然是在类型擦除后实现Comparable接口的类。

另见: