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 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试