《深入理解Java虚拟机》代码清单8-15的问题MethodHandle

wangkzhong12 2016-12-21 05:46:48

import java.lang.invoke.MethodHandle;
import static java.lang.invoke.MethodHandles.lookup;
import java.lang.invoke.MethodType;

public 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 ()
{

// System.out.println("I am son");
try {
MethodType mt = MethodType.methodType(void.class);
MethodHandle mh = lookup().findSpecial(GrandFather.class, "thinking",mt , getClass());
mh.invoke(this);
} catch (Throwable e) {
// TODO: handle exception
}

}

}

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

}

}


代码如上所示,书上说输出应为I am grandfather,而我的实际输出为I am father
...全文
795 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
a60782885 2017-09-15
  • 打赏
  • 举报
回复
MethodType mt = MethodType.methodType(void.class);
            MethodHandle mh = lookup().findVirtual(GrandFather.class,"think",mt).bindTo(new GrandFather());
            mh.invokeExact();
zs808 2017-09-15
  • 打赏
  • 举报
回复
这个问题可以移步知乎R大的回答: https://www.zhihu.com/question/40427344
galiniur0u 2017-09-15
  • 打赏
  • 举报
回复
应该是jdk版本变更导致的无法获取跟父类方法导致。这个问题网上查一下,会有详细的说明。
yzh__ 2017-05-18
  • 打赏
  • 举报
回复
https://www.zhihu.com/question/40427344这里有解决
yzh__ 2017-05-18
  • 打赏
  • 举报
回复
同样的问题,楼主解决了没有?
小枫丶 2017-04-29
  • 打赏
  • 举报
回复
我也遇到了同样的问题,好苦恼,请问您是怎么解决的呢?
wangkzhong12 2016-12-21
  • 打赏
  • 举报
回复
求不沉,顶起来

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧