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

Java 在重写的方法上使用方法.getReturnType(),java,reflection,subclass,Java,Reflection,Subclass,我有一个类需要获取一个方法的返回类型,该方法已被其他内容覆盖 假设我有一门课,比如: public class SuperDuperClass { public Object someMethod(); } 然后创建一个子类: public class DuperClass extends SuperDuperClass{ public String someMethod(); } 然后,我获得DuperClass的someMethod(): Method theMethod

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

假设我有一门课,比如:

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是字符串,就像DuperClass中定义的那样。但是,我接收的对象是SuperDuperClass中定义的对象。反射似乎并不真正关心被重写的方法是否返回另一个类型,因此返回supermethod类型

在这种情况下,子类的返回类型是什么

我接受巫毒、巫术和血魔法


我会在允许的时候发布一个真正的回复

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


愚蠢的我。

你是在协变返回类型的情况下
你可以在这里找到解释

问题很简单

DuperClass.class.getMethod("someMethod", new Class[]{});
只返回一个方法。但实际上,有两种方法与此签名一起存在。getMethods返回一个返回类型为“Object”的someMethod和一个返回类型为“String”的someMethod

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

反而

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

返回正确的方法。

我已经测试了您的示例,得到了
java.lang.String
。所以我不明白是什么问题。您使用哪个版本的java?哪个java编译器?您可以先尝试
Class.getDeclaredMethod
,然后自己向上遍历继承。但我怀疑每个编译器都会使用
getMethod
,所以这是一个bug,泛型的用法或其他什么。在他回答Andremoniyjava版本“1.7.0_07”Java(TM)SE运行时环境(build 1.7.0_07-b10)Java HotSpot(TM)64位服务器VM(build 23.3-b01,混合模式)之前,你们应该停止投票,如果它只适合你们,我无法确切解释原因。但事实并非如此。我想问题不在于代码?你是否尝试过使用我们都建议过的
getDeclaredMethod
?是的,我没有在回答中反映这一点。很抱歉,这会给出答案;类中同时存在
Object someMethod()
String someMethod()
。下次也解释一下;也许是代码。