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

在Java反射体系中,getDeclaredMethods是Class类提供的重要方法,用于获取类的方法信息。很多开发者初次接触时会疑惑,这个方法是否会返回父类的方法,实际它的设计逻辑是仅获取当前类自身声明的方法,不包含任何父类的方法。

深入getDeclaredMethods:反射如何获取父类以外的所有方法

getDeclaredMethods方法的基本定义

getDeclaredMethods方法的官方定义是返回当前Class对象表示的类或接口声明的所有方法,包括公共、保护、默认访问和私有方法,但不包括继承的方法。这里的声明指的是方法在当前类的代码中被直接定义,而不是从父类继承而来。

我们可以通过一个简单的示例来验证这个特性,首先定义父类和子类:

// 父类定义
class Parent {
    public void parentPublicMethod() {
        System.out.println("父类公共方法");
    }
    
    private void parentPrivateMethod() {
        System.out.println("父类私有方法");
    }
}

// 子类定义,继承Parent,自身声明两个方法
class Child extends Parent {
    public void childPublicMethod() {
        System.out.println("子类公共方法");
    }
    
    private void childPrivateMethod() {
        System.out.println("子类私有方法");
    }
}

getDeclaredMethods的实际返回结果验证

接下来我们编写测试代码,分别调用子类的getDeclaredMethods方法,查看返回的方法列表:

import java.lang.reflect.Method;

public class ReflectTest {
    public static void main(String[] args) {
        Class<Child> childClass = Child.class;
        // 获取子类的getDeclaredMethods结果
        Method[] declaredMethods = childClass.getDeclaredMethods();
        System.out.println("Child类的getDeclaredMethods返回方法:");
        for (Method method : declaredMethods) {
            System.out.println(method.getName());
        }
    }
}

运行上述代码后,输出结果如下:

Child类的getDeclaredMethods返回方法:
childPublicMethod
childPrivateMethod

可以看到,结果中只有子类自身声明的两个方法,父类的parentPublicMethodparentPrivateMethod都没有被返回,这直接验证了getDeclaredMethods不会获取父类方法的特点。

与getMethods方法的差异对比

很多开发者容易把getDeclaredMethodsgetMethods混淆,两者的核心差异如下:

对比项getDeclaredMethodsgetMethods
返回范围仅当前类声明的所有访问权限方法当前类及所有父类的公共方法
私有方法包含不包含
继承方法不包含包含公共继承方法

同样用上面的Parent和Child类测试getMethods的结果:

import java.lang.reflect.Method;

public class ReflectTest2 {
    public static void main(String[] args) {
        Class<Child> childClass = Child.class;
        Method[] methods = childClass.getMethods();
        System.out.println("Child类的getMethods返回方法:");
        for (Method method : methods) {
            System.out.println(method.getName());
        }
    }
}

运行后会发现输出包含parentPublicMethod,以及Object类继承来的公共方法,但依然没有父类的私有方法parentPrivateMethod,也没有子类自身的私有方法childPrivateMethod

使用场景与注意事项

getDeclaredMethods适合需要获取当前类完整方法定义的场景,比如框架开发中需要扫描类自身的全部方法做注解解析、方法调用权限校验等。使用时需要注意:

  • 如果需要访问私有方法,需要调用method.setAccessible(true)来取消访问权限检查,否则会抛出IllegalAccessException。
  • 如果需要获取父类的方法,不能依赖getDeclaredMethods,需要递归遍历父类的Class对象,调用对应方法获取。
  • 接口的实现方法如果是在接口中声明的默认方法,在实现类的getDeclaredMethods中不会被返回,因为默认方法属于接口声明,不属于实现类自身声明。

递归获取所有父类声明方法的示例

如果确实需要获取当前类及其所有父类的声明方法,可以通过递归遍历父类实现:

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ReflectUtil {
    public static List<Method> getAllDeclaredMethods(Class<?> clazz) {
        List<Method> methodList = new ArrayList<>();
        // 遍历当前类及所有父类
        while (clazz != null && clazz != Object.class) {
            Method[] declaredMethods = clazz.getDeclaredMethods();
            for (Method method : declaredMethods) {
                methodList.add(method);
            }
            // 获取父类继续遍历
            clazz = clazz.getSuperclass();
        }
        return methodList;
    }
    
    public static void main(String[] args) {
        List<Method> allMethods = getAllDeclaredMethods(Child.class);
        System.out.println("Child类及所有父类的声明方法:");
        for (Method method : allMethods) {
            System.out.println(method.getDeclaringClass().getSimpleName() + "." + method.getName());
        }
    }
}

运行上述工具类,会输出Child类的两个方法和Parent类的两个方法,实现了获取所有父类声明方法的需求。

getDeclaredMethods反射Java父类方法修改时间:2026-06-18 07:03:34

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