首先这是一段普通的代码子类继承父类并重写了print方法
public class TestVisualInvoke {
public static class Father {
public void print() {
System.out.println("father's print");
}
}
public static class Son extends Father {
@Override
public void print() {
System.out.println("son's print");
}
}
public static void main(String[] args) {
new Son().print();
}
}
众所周知这段代码执行结果为
son's print
那么我们怎么才能达到输出下边的结果呢?
father's print
首先你得用JDK7,因为JDK7中加入了动态类型的新特性。
然后如下的代码可以达到我们预期的效果:
MethodType mt = MethodType.methodType(void.class);
MethodHandle methodHandle = MethodHandles.lookup().findSpecial(Father.class, "print", mt, Father.class);
methodHandle.invoke();
但是因为findSpecial方法中做了安全限制:调用MethodHandles.lookup()的类要与findSpecial最后一个参数相同。要不然会报错。
所以整体的代码需要这么写:
public class TestVisualInvoke {
public static class Father {
public void print() {
System.out.println