我想这样做:Use reflection to invoke an overridden base method 但
我有:
package test;
public class A{
public String toString(){
return "A";
}
}
package test;
public class B extends A{
public String toString(){
return "B";
}
}
我希望((A)(new B())).toString()
为“A”,而不是“B”。有没有办法通过反射得到这个?
答案 0 :(得分:2)
MethodHandles可用于调用超类方法:
答案 1 :(得分:1)
您的挑战(我希望((A)(new B())).toString()
是“ A”,而不是“ B”。)与反思完全无关。即使您在Java程序中执行((A)(new B())).toString()
而不进行反射,它也将始终显示“ B”。这是因为类A和类B都覆盖了toString()
方法,在运行时将确定实际对象类型,并调用该类型/类的toString()
方法。因此,在您的示例中:您创建了一个B的实例,因此实际对象类型为B!然后您向上转换为A,因此引用类型现在将为A,但是引用的“真实”对象类型将保持为B!
https://www.programcreek.com/2009/02/overriding-and-overloading-in-java-with-examples/