使用java中的反射调用重写的实例方法

时间:2014-02-06 22:49:21

标签: java reflection

我想这样做:Use reflection to invoke an overridden base method  但

  • 在java中完成它
  • 当没有在子方法上指定@Override时(这是因为我没有访问源的时候)

我有:


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”。有没有办法通过反射得到这个?

2 个答案:

答案 0 :(得分:2)

MethodHandles可用于调用超类方法:

https://www.baeldung.com/java-method-handles

答案 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/