ITPub博客

首页 > IT职业 > IT生活 > 《深入理解Java虚拟机(第2版)》使用MethodHandle来解决

《深入理解Java虚拟机(第2版)》使用MethodHandle来解决

IT生活 作者:chinacc 时间:2021-09-09 09:11:24 0 删除 编辑
https://www.zhihu.com/question/40427344/answer/86545388
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

您自己实验得到的结果是正确的,而您参考的书所说的是错误的。
MethodHandle用于模拟invokespecial时,必须遵守跟Java字节码里的invokespecial指令相同的限制——它只能调用到传给findSpecial()方法的最后一个参数(“specialCaller”)的直接父类的版本。invokespecial指令的规定可以参考JVM规范:Chapter 6. The Java Virtual Machine Instruction Set,不过这部分写得比较“递归”所以不太直观。

findSpecial()还特别限制如果Lookup发现传入的最后一个参数(“specialCaller”)跟当前类不一致的话默认会马上抛异常:jdk8u/jdk8u/jdk: e2117e30fb39 src/share/classes/java/lang/invoke/MethodHandles.java

在这个例子里,Son <: father grandfather>

请参考文档:MethodHandles.Lookup (Java Platform SE 8 )-

题主所参考的书给的例子不正确,可能是因为findSpecial()得到的MethodHandle的具体语义在JSR 292的设计过程中有被调整过。有一段时间findSpecial()得到的MethodHandle确实可以超越invokespecial的限制去调用到任意版本的虚方法,但这种行为很快就被认为是bug而修正了。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4677/viewspace-2800231/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-26

  • 博文量
    91
  • 访问量
    918