java如何通过子类调用祖父类的

本文介绍了在Java中如何通过子类调用祖父类的方法,尤其是当遇到JDK版本更新带来的安全性改变。在JDK7 Update 9之前,可以使用特定方法,但之后此逻辑被视为潜在安全缺陷并被限制。通过分析`findSpecial()`和`in(specialCaller)`源码,发现可以通过设置`allowedModes`参数为`TRUSTED`绕过访问保护,尽管这个参数不是公开的,但可以通过反射实现。
摘要由CSDN通过智能技术生成

  在java中,可以通过“super”关键字,很方便的调用到父类中的方法,但是要调用祖父类的方法该怎么样实现呢,本文记录一下《深入理解java虚拟机》一书中的介绍。

  在拥有invokedynamic和java.lang.invoke包之前,使用存粹的java语言很难处理这个问题,原因是子类的方法中根本没有办法获取一个实际类型是祖父类的对象引用,但是有了这两个包,java程序员可以直接解决,在jdk7 update9之前,可以使用以下方法解决:

package com.example.demo.test;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;

public class TestExtends {
    public static void main(String[] args){
        Son son = new Son();
        son.thinking();
    }
}

class GrandFather {
    public void thinking(){
        System.out.println("GrandFather thinking");
    }
}

class Father extends GrandFather {
    public void thinking(){
        System.out.println("Father thinking");
    }
}

class Son extends Father {
    public void thinking(){
        try{
            MethodType mt = MethodType.metho
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值