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

在java中使用反射调用重写的实例方法,java,reflection,Java,Reflection,我想这样做: 但是 用java完成了吗 以及未在子方法上指定@Override时(这适用于我无权访问源的情况) 我有: 我希望((A)(新的B())。toString()是“A”,而不是“B”。有没有一种方法可以通过反射来实现这一点 你的挑战(我希望((A)(新B())。toString()成为“A”,而不是“B”)与反射毫无关系。即使在java程序中无反射地执行((A)(new B()).toString(),它也将始终打印“B”。原因是类A和B都重写了toString()方法,在运

我想这样做: 但是

  • 用java完成了吗
  • 以及未在子方法上指定@Override时(这适用于我无权访问源的情况)
我有:




我希望
((A)(新的B())。toString()
是“A”,而不是“B”。有没有一种方法可以通过反射来实现这一点

你的挑战(我希望
((A)(新B())。toString()
成为“A”,而不是“B”)与反射毫无关系。即使在java程序中无反射地执行
((A)(new B()).toString()
,它也将始终打印“B”。原因是类A和B都重写了
toString()
方法,在运行时将确定实际对象类型,并调用该类型/类的
toString()
方法。在你的例子中:你创建了一个B的实例,所以真正的对象类型是B!然后您向上转换为A,因此引用类型现在将是A,但被引用的“真实”对象类型将保持为B

你的挑战(我想要
((A)(新的B())。toString()
成为“A”,而不是“B”)与反射毫无关系。即使在java程序中无反射地执行
((A)(new B()).toString()
,它也将始终打印“B”。原因是类A和B都重写了
toString()
方法,在运行时将确定实际对象类型,并调用该类型/类的
toString()
方法。在你的例子中:你创建了一个B的实例,所以真正的对象类型是B!然后您向上转换为A,因此引用类型现在将是A,但被引用的“真实”对象类型将保持为B

你的挑战(我想要
((A)(新的B())。toString()
成为“A”,而不是“B”)与反射毫无关系。即使在java程序中无反射地执行
((A)(new B()).toString()
,它也将始终打印“B”。原因是类A和B都重写了
toString()
方法,在运行时将确定实际对象类型,并调用该类型/类的
toString()
方法。在你的例子中:你创建了一个B的实例,所以真正的对象类型是B!然后您向上转换为A,因此引用类型现在将是A,但被引用的“真实”对象类型将保持为B

你的挑战(我想要
((A)(新的B())。toString()
成为“A”,而不是“B”)与反射毫无关系。即使在java程序中无反射地执行
((A)(new B()).toString()
,它也将始终打印“B”。原因是类A和B都重写了
toString()
方法,在运行时将确定实际对象类型,并调用该类型/类的
toString()
方法。在你的例子中:你创建了一个B的实例,所以真正的对象类型是B!然后您向上转换为A,因此引用类型现在将是A,但被引用的“真实”对象类型将保持为B


MethodHandles可用于调用超类方法:


MethodHandles可用于调用超类方法:


MethodHandles可用于调用超类方法:


MethodHandles可用于调用超类方法:


很酷。开始写一些代码。如果你有问题,请回来@重写与问题无关,顺便说一句,您在@zcaudate遇到了一个问题。
@Override
注释是一种未出现在编译字节码中的注释。这是一个编译时语言功能。我已经更新了我的问题。酷。开始写一些代码。如果你有问题,请回来@重写与问题无关,顺便说一句,您在@zcaudate遇到了一个问题。
@Override
注释是一种未出现在编译字节码中的注释。这是一个编译时语言功能。我已经更新了我的问题。酷。开始写一些代码。如果你有问题,请回来@重写与问题无关,顺便说一句,您在@zcaudate遇到了一个问题。
@Override
注释是一种未出现在编译字节码中的注释。这是一个编译时语言功能。我已经更新了我的问题。酷。开始写一些代码。如果你有问题,请回来@重写与问题无关,顺便说一句,您在@zcaudate遇到了一个问题。
@Override
注释是一种未出现在编译字节码中的注释。这是一个编译时语言功能。我已更新了我的问题。请参阅问题中链接的c#示例。请参阅问题中链接的c#示例。请参阅问题中链接的c#示例。请参阅问题中链接的c#示例。
package test;

public class A{
  public String toString(){
    return "A";
  }
}
package test;

public class B extends A{
  public String toString(){
    return "B";
  }
}