java调用祖类方法

假设有一个祖类叫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();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_36779082/article/details/87370777
今日推荐