我看书中运行的结果是 i am grandfather 但是我实测结果是i am father
是由于JDK8 的缘故还是怎么呢? 求大神指点
package lookup;
import static java.lang.invoke.MethodHandles.lookup;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
class GrandFather{
void think() {
System.out.println("i am grandfather");
}
}
class Father extends GrandFather{
void think() {
System.out.println("i am father");
}
}
class Son extends Father{
void think() {
try {
MethodType mt = MethodType.methodType(void.class);
MethodHandle mh = lookup().findSpecial(GrandFather.class, "think", mt ,getClass());
mh.invoke(this);
} catch (Throwable e) {
}
}
}
public class Test {
public static void main(String[] args) {
new Son().think();
}
}
是周志明老师的那本书吗?我在jdk1.8上测试结果也是“i am father”.
这篇文章给了说明,https://www.imooc.com/article/details/id/25992
源码来自周志明深入理解Java虚拟机(第二版)第八章 P268 知道为什么能和我分享一下吗?
@水冷: 啊哦,我也是看了你的提问之后,才想到这么一节,让我学到了新的一种类似于反射,但是有别于反射机制的一个方法,可以去执行类中的某个方法。它对于我来说就像是一个api接口一样,知道这种用法。至于为什么?我也理解不了。这篇文章说的感觉有点道理吧:https://www.imooc.com/article/details/id/25992,