【发布时间】:2017-12-11 01:34:07
【问题描述】:
我想这个问题以前有人问过,但没有立即找到答案。
说,不知何故,Pet 引用被分配了一个 Dog 对象:
Pet pet = new Dog();
如果我写
pet.attackInvader();
调用子类(Dog)的方法是因为 Java 中的所有函数都是虚函数。
是否可以改为调用Pet 的attackInvader()?
(我知道我可以编辑Dog 的方法来调用super,但是,在这种情况下,假设我不能更改Dog 的实现。)
【问题讨论】:
-
我知道以前有人问过,我会搜索它...
-
DM:好的,谢谢。
-
AFAIK,这是不可能的(没有严重的反思)。
-
@AndyTurner 我不同意这是该特定问题的重复,即使它几乎可以肯定是重复的。如果您无法修改
Dog,super()将无济于事。 -
java.lang.invoke.MethodHandle提供了一个脆弱的解决方法。您基本上使用 {Pet.class,Lookup.PRIVATE} 反射调用私有MethodHandles.Lookup(Class<?>, int)构造函数,然后在查找对象上调用findSpecial以获取描述非覆盖方法的MethodHandle,最后通过句柄调用它,在您的pet(Dog) 实例上。我相信至少有一个答案可以证明这种方法,但现在找不到。
标签: java polymorphism