1. 程式人生 > >java呼叫祖父類裡被父類重寫了的例項方法

java呼叫祖父類裡被父類重寫了的例項方法

java.lang.invoke 包主要用於動態確定目標方法
在java語言中無法把函式作為一種引數進行傳遞,C++裡有函式指標,C#裡有相似的delegate、event型別。在java裡普遍的做法是傳遞1個實現了某個介面例項作為引數。
MethodHandle可以讓java語言擁有跟函式指標類似的工具

public class AncestorsRelation {
    class Grandfather{
        public void say(){
            System.out.println("It's grandfather said!");
        }
    }

    class Father extends Grandfather{
        public
void say(){ System.out.println("It's father said!"); } } class Son extends Father{ public void say(){ //如何在此處呼叫Grandfather的say方法 //方法1: //new Grandfather().say(); //方法2: //使用MethodHandle呼叫Grandfather的建構函式後再呼叫say方法
} } }

第二種方法實現如下

 public void say(){
        System.out.println("It's son said!");
        //使用MethodType構造出要呼叫方法的返回型別
        MethodType methodType = MethodType.methodType(void.class);
        try {
        //找到祖父類的建構函式
            MethodHandle inithandle = MethodHandles.lookup().findConstructor(Grandfather.class, methodType);
            //獲取祖父類例項物件
Object o = inithandle.invoke(); //找到祖父類裡被覆寫的方法並把該方法繫結到祖父類例項上 MethodHandle handle = MethodHandles.lookup() .findVirtual(Grandfather.class, "say", methodType).bindTo(o); //呼叫祖父類裡被父類覆寫的方法 handle.invoke(); } catch (Throwable throwable) { throwable.printStackTrace(); } }