Java反射怎么获取对象的方法

来源:安卓APP网作者:新加坡程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《Java反射怎么获取对象的方法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java反射怎么获取对象的方法》有用,将其分享出去将是对创作者最好的鼓励。

Java反射机制可以在程序运行时动态获取类的结构信息,其中获取对象的方法是反射的常见使用场景,通过相关API可以拿到类定义的所有方法并完成后续调用操作。

Java反射怎么获取对象的方法

反射获取对象方法的核心API

Java反射中获取对象方法主要依赖Class类的两个核心方法,二者的使用场景和返回结果有明显区别:

  • getMethods():返回当前类及其所有父类、父接口中的公开(public)方法,返回类型为Method[]数组。
  • getDeclaredMethods():仅返回当前类自身定义的所有方法,包括私有(private)、受保护(protected)、默认访问权限和公开方法,不包含继承的方法,返回类型同样为Method[]数组。

获取公开方法的示例

以下示例定义一个父类和一个子类,演示getMethods()的使用效果:

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

// 子类
class Child extends Parent {
    public void childPublicMethod() {
        System.out.println("子类公开方法");
    }
    private void childPrivateMethod() {
        System.out.println("子类私有方法");
    }
}

public class ReflectGetMethodDemo {
    public static void main(String[] args) {
        Class<Child> childClass = Child.class;
        // 获取所有公开方法,包含父类的公开方法
        Method[] publicMethods = childClass.getMethods();
        System.out.println("getMethods()获取的方法列表:");
        for (Method method : publicMethods) {
            System.out.println(method.getName());
        }
    }
}

上述代码执行后,输出的方法会包含childPublicMethodparentPublicMethod,同时还会包含从Object类继承的toStringhashCode等公开方法,不会包含任何私有方法。

获取所有自定义方法的示例

如果需要获取类自身定义的所有方法,包括私有方法,需要使用getDeclaredMethods()

public class ReflectGetDeclaredMethodDemo {
    public static void main(String[] args) {
        Class<Child> childClass = Child.class;
        // 获取当前类自身定义的所有方法,不包含继承的方法
        Method[] declaredMethods = childClass.getDeclaredMethods();
        System.out.println("getDeclaredMethods()获取的方法列表:");
        for (Method method : declaredMethods) {
            System.out.println(method.getName());
        }
    }
}

上述代码执行后,输出的方法仅包含childPublicMethodchildPrivateMethod,不会包含父类的方法,也不会包含Object类继承的方法。

获取指定参数的单个方法

如果只需要获取某一个指定方法,可以通过带参数的getMethodgetDeclaredMethod方法,参数为方法名和方法的参数类型列表:

public class ReflectGetSingleMethodDemo {
    public static void main(String[] args) throws Exception {
        Class<Child> childClass = Child.class;
        // 获取无参数的childPublicMethod公开方法
        Method publicMethod = childClass.getMethod("childPublicMethod");
        System.out.println("获取到的公开方法名:" + publicMethod.getName());
        
        // 获取带参数的私有方法,假设Child类有方法 private void test(int a, String b)
        // Method privateMethod = childClass.getDeclaredMethod("test", int.class, String.class);
        // System.out.println("获取到的私有方法名:" + privateMethod.getName());
    }
}

通过反射调用获取到的方法

通过反射获取到Method对象后,可以通过invoke方法完成方法调用,调用私有方法前需要先设置访问权限:

public class ReflectInvokeMethodDemo {
    public static void main(String[] args) throws Exception {
        Child child = new Child();
        Class<? extends Child> childClass = child.getClass();
        
        // 调用公开方法
        Method publicMethod = childClass.getMethod("childPublicMethod");
        publicMethod.invoke(child);
        
        // 调用私有方法
        Method privateMethod = childClass.getDeclaredMethod("childPrivateMethod");
        // 设置私有方法可访问
        privateMethod.setAccessible(true);
        privateMethod.invoke(child);
    }
}

反射获取方法的注意事项

  • 获取私有方法时必须使用getDeclaredMethodgetDeclaredMethods,否则会抛出NoSuchMethodException
  • 调用私有方法前必须调用setAccessible(true),否则会抛出IllegalAccessException
  • 反射调用方法的性能比直接调用低,不要在高频执行的代码逻辑中大量使用反射调用。
  • 方法参数类型传递必须准确,比如基本类型要传int.class而不是Integer.class,否则会匹配不到对应方法。

Java反射getDeclaredMethodsgetMethodsMethod对象invoke方法修改时间:2026-06-19 04:12:30

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