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()
。下次也解释一下;也许是代码。