Java反射

小问题还是直接上代码比较直观

Parent类(父类)

package com.xiongyu.reflect;

public class Parent {
    public void method1() {
        System.out.println("Parent:method1");
        this.method2();
    }

    public void method2() {
        System.out.println("Parent:method2");
    }
}

Children类(Parent类的子类)

package com.xiongyu.reflect;

public class Children extends Parent {
    public void method1() {
        System.out.println("Children:mehtod1");
        super.method1();
    }

    public void method2() {
        System.out.println("Children:method2");
    }

    public void method3() {
        System.out.println("Children:method3");
    }
}

开始测试

package com.xiongyu.reflect;

public class Test_Main {
    public static void main(String[] args) {
        Parent p = new Children();
        p.method1();
    }
}

下面是打印输出的结果:

Children:mehtod1
Parent:method1
Children:method2

这能说明什么?表示我对此并不感到很惊讶!!
【注:对此表示惊讶的同学得回去看看java基础了】

别急,好戏开始了,现在我对输出有点不满,我要下面这个!
Children:mehtod1
Parent:method1
Children:method3

【注:简单说就是在执行Parent类的method1后回来执行Children类的method3方法,怎么办?】

方法一?
重写Parent类的method1方法

public void method1() {
        System.out.println("Parent:method1");
        this.method3();
    }

纳里,编译都过不了。。。。。。

编译过不了是必然的,因为这里只能调用在父类中声明的方法:method1()和method2(),而method3()是子类特有的,父类里面“看不到”,所以这里会编译出错!

但是,我们发现一个问题,程序运行起来后,这里的this明明就是子类对象啊!这可真是干着急啊,到嘴的肥肉竟然不能吃。办法当然是有的,现在进入正题。

既然问题的关键已经找到了,就是这个this搞的鬼。我们直接上代码。

方法二:
重写父类的method1方法:

public void method1() {
        System.out.println("Parent:method1");
        try {
            Method method = this.getClass().getDeclaredMethod("method3", null);
            method.invoke(this, null);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

下面是打印输出的结果:

Children:mehtod1
Parent:method1
Children:method3

正题结束,这回真的就是指哪打哪了,加了几行代码就搞定了,收工。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值