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();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值