导读:本期聚焦于小伙伴创作的《如何通过 Class 对象和父类引用访问子类方法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何通过 Class 对象和父类引用访问子类方法》有用,将其分享出去将是对创作者最好的鼓励。

在Java的多态特性中,我们经常会使用父类引用指向子类实例,但父类引用只能直接调用父类中声明的方法,子类独有的方法无法直接通过父类引用访问。这时候可以通过Class对象的反射能力,或者合理的类型转换来实现对子类方法的访问。

如何通过 Class 对象和父类引用访问子类方法

基础场景准备

首先我们先定义父类和子类,父类包含一个公共方法,子类继承父类并新增一个独有的方法,同时重写父类的公共方法,方便后续演示。

// 定义父类
class Parent {
    public void parentMethod() {
        System.out.println("这是父类的方法");
    }
}

// 定义子类,继承父类
class Child extends Parent {
    // 重写父类方法
    @Override
    public void parentMethod() {
        System.out.println("子类重写的父类方法");
    }

    // 子类独有的方法
    public void childOnlyMethod() {
        System.out.println("这是子类独有的方法");
    }
}

通过父类引用获取实际Class对象访问子类方法

当我们有父类引用指向子类实例时,可以通过getClass()方法获取实际对象的Class对象,再通过反射调用子类的方法。这种方式不需要提前知道具体的子类类型,适合运行时动态处理的场景。

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        // 父类引用指向子类实例
        Parent parentRef = new Child();
        
        // 调用父类可访问的方法,实际执行子类重写后的版本
        parentRef.parentMethod();
        
        // 通过父类引用获取实际对象的Class对象,即Child的Class对象
        Class<?> childClass = parentRef.getClass();
        
        // 获取子类独有的方法,参数为方法名和参数类型,无参方法传空数组
        Method childMethod = childClass.getMethod("childOnlyMethod");
        
        // 调用方法,传入实际对象实例,无参方法传空数组
        childMethod.invoke(parentRef);
    }
}

运行上述代码会先输出子类重写的父类方法,再输出这是子类独有的方法,说明通过Class对象的反射成功调用了子类独有的方法。

直接通过子类Class对象创建实例访问方法

如果我们知道具体的子类类型,也可以直接获取子类的Class对象,创建实例后调用子类方法,这种方式更直观,适合明确子类类型的场景。

import java.lang.reflect.Method;

public class Test2 {
    public static void main(String[] args) throws Exception {
        // 获取子类的Class对象
        Class<?> childClass = Class.forName("Child");
        
        // 创建子类实例,需要强转为父类类型或者子类类型
        Parent parentRef = (Parent) childClass.getDeclaredConstructor().newInstance();
        
        // 调用重写的方法
        parentRef.parentMethod();
        
        // 如果需要调用子类独有方法,可以强转为子类类型,或者通过反射调用
        // 方式1:强转为子类类型
        Child child = (Child) parentRef;
        child.childOnlyMethod();
        
        // 方式2:继续通过反射调用
        Method childMethod = childClass.getMethod("childOnlyMethod");
        childMethod.invoke(parentRef);
    }
}

两种方式对比

两种方式各有适用场景,我们可以通过下面的表格快速了解差异:

实现方式适用场景优点缺点
父类引用获取实际Class对象反射调用运行时不知道具体子类类型,只有父类引用无需提前知道子类类型,灵活度高需要处理反射相关的异常,性能略低于直接调用
子类Class对象创建实例调用明确知道子类类型,需要创建实例调用方法代码更直观,可直接强转调用,性能更好需要提前知道子类类型,灵活性较低

注意事项

  • 使用反射调用方法时,需要处理NoSuchMethodExceptionIllegalAccessExceptionInvocationTargetException等异常,实际开发中要做好异常处理。
  • 如果子类方法是私有的,需要使用getDeclaredMethod获取方法,并且设置method.setAccessible(true)才能调用。
  • 强制类型转换的前提是父类引用实际指向的就是该子类的实例,否则会抛出ClassCastException异常。
反射虽然灵活,但会破坏封装性,同时带来一定的性能开销,实际开发中如果不是必要场景,优先使用多态和合理的类型设计,避免过度使用反射。

Class对象父类引用子类方法Java反射修改时间:2026-06-04 03:23:07

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。