假设有一个祖类叫GrandFather,该类存在一个test()方法;
然后其子类为Father,Father类重写了test()方法;
Father又有一个子类为Son,众所周知,Son类里面的方法如果要调用Father的test()方法可以通过super.test()实现;可是若Son类里面的方法需要调用GrandFather类的test()方法呢?
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
class GrandFather{
public void test(){
System.err.println("GrandFather");
}
}
class Father extends GrandFather{
@Override
public void test(){
System.err.println("Father");
}
}
public class Son extends Father{
@Override
public void test(){
try{
MethodType mt= MethodType.methodType(void.class); //方法返回类型
MethodHandle mh =MethodHandles.lookup().findSpecial(GrandFather.class,"test",mt,getClass());
mh.invoke(this);
}catch(Throwable e){
e.printStackTrace();
}
}
}
以上代码需要jdk版本1.7以上才支持,jdk1.7以下没有MethodHandle 类和MethodType 类。
-----------后续更新----------
参看其他博主的文章后发现jdk1.8以后还可以这样实现:
public class Son extends Father{
@Override
public void test(){
try{
MethodType mt = MethodType.methodType(void.class);
Field IMPL_LOOKUP = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP");
IMPL_LOOKUP.setAccessible(true);
MethodHandles.Lookup lkp = (MethodHandles.Lookup)IMPL_LOOKUP.get(null);
MethodHandle h1 = lkp.findSpecial(GrandFather.class, "test", mt, GrandFather.class);
h1.invoke(this);
}catch(Throwable e){
e.printStackTrace();
}
}
}