toponexds 2016-02-16 04:27 采纳率: 0%
浏览 1878
已结题

《深入理解Java虚拟机》有关methodHandle的代码问题?

以下代码书上说是输出“i am grandfather”,但远行实际输出为“i am father”
class Test {

class GrandFather {
void thinking() {
System.out.println("i am grandfather");
}
}

class Father extends GrandFather {
void thinking() {
System.out.println("i am father");
}
}

class Son extends Father {
void thinking() {
try {
MethodType mt = MethodType.methodType(void.class);
MethodHandle mh = lookup().findSpecial(GrandFather.class,
"thinking", mt, getClass());
mh.invoke(this);
} catch (Throwable e) {
}
}
}

public static void main(String[] args) {
    (new Test().new Son()).thinking();
}

}
求解!!

  • 写回答

5条回答

  • 毕小宝 博客专家认证 2016-02-16 07:38
    关注

    个人理解是这样的:invokespecial指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法,对应findSpecial方法返回。此处,MethodHandles.lookup().findSpecial(GrandFather.class, "thinking", mt, getClass());你需要查找的是GrandFather类型,由当前Son类型作为调用者,调用父类的thinking方法。由于Son继承自Father,而Father又继承GrandFather,所以Son本质也是一个GrandFather类型。
    那么查找GrandFather类型的thinking方法,并且是由Son作为子类调用,最终得到的方法就是Father类的thinking()。
    这个方法的api是这样描述的:

     Produces an early-bound method handle for a virtual method.
    

    所以此方法返回的绑定GrandFather类型的thinking方法,最终是Father类的thinking()。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog