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

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
可以看到,结果中只有子类自身声明的两个方法,父类的parentPublicMethod和parentPrivateMethod都没有被返回,这直接验证了getDeclaredMethods不会获取父类方法的特点。
与getMethods方法的差异对比
很多开发者容易把getDeclaredMethods和getMethods混淆,两者的核心差异如下:
| 对比项 | getDeclaredMethods | getMethods |
|---|---|---|
| 返回范围 | 仅当前类声明的所有访问权限方法 | 当前类及所有父类的公共方法 |
| 私有方法 | 包含 | 不包含 |
| 继承方法 | 不包含 | 包含公共继承方法 |
同样用上面的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