在重写方法上使用Method.getReturnType()

时间:2015-08-28 09:10:20

标签: java reflection subclass

我有一个类需要获取方法的返回类型,该类已被其他方法覆盖。

假设我有一个类:

public class SuperDuperClass {
    public Object someMethod();
}
然后我创建了一个子类:

public class DuperClass extends SuperDuperClass{
    public String someMethod();
}

然后我获得了DuperClass的someMethod()

Method theMethod = DuperClass.class.getMethod("someMethod", new Class[]{});
Class theMethodReturnType = theMethod.getReturnType();

我非常希望returnType为String,如DuperClass中所定义。但是,我收到了SuperDuperClass中定义的Object。似乎反射并不关心overriden方法返回另一个类型,因此返回了supermethod类型。

在这种情况下,有什么东西可以获得子类的返回类型吗?

我接受伏都教,巫术和血魔法。

Ansver:当我被允许时,我会发布一个真正的ansver。

getMethods()方法返回两个someMethod实例。我正在使用getMethod,至少在我的JVM上,它返回超类(而不是子类)。

愚蠢的我。

2 个答案:

答案 0 :(得分:3)

您处于协变返回类型的情况 你可以在https://dzone.com/articles/covariant-return-type-abyssal

找到解释

答案 1 :(得分:2)

问题就在此。

*|IF:house=true|*
   House,  
*|END:IF|* 

*|IF:garden=true|*
    Garden,  
*|END:IF|*  

*|house!=true && garden=!true|*                                        
    House and Garden not included
*|END:IF|*   

只返回一种方法。但实际上,这种签名存在两种方法。 getMethods返回someMethod和" Object"返回类型,以及" String"返回类型。

getMethod返回哪一个似乎并不完全可靠。

相反

DuperClass.class.getMethod("someMethod", new Class[]{});

返回正确的方法。