可通过反射获取子类继承的父类抽象方法元数据:用getmethods()筛选public抽象方法并结合getdeclaringclass()判断来源;若需protected/package-private方法,则递归遍历父类调用getdeclaredmethods();getdeclaringclass()指向首次声明类,泛型信息通过getgenericxxx系列方法获取。

可以通过 Class 对象配合反射 API 获取子类继承的父类抽象方法元数据,关键在于区分“可见性”与“继承来源”——抽象方法只要被子类继承(即使未重写),就可通过 getMethods() 或递归扫描父类声明获取。
获取所有继承的 public 抽象方法(含父类)
getMethods() 返回当前类及所有父类、接口中所有 public 方法(含抽象方法),但不区分是否来自父类或是否抽象。需结合 Modifier.isAbstract() 和 getDeclaringClass() 判断来源:
- 调用
clazz.getMethods()得到全部 public 方法数组 - 对每个
Method m,用m.getModifiers()检查Modifier.isAbstract(m.getModifiers()) - 用
m.getDeclaringClass() != clazz确认该方法声明在父类(或接口)中,而非当前子类自身定义 - 注意:接口中的 abstract 方法也会被包含,若只关注类继承链,需额外过滤
!m.getDeclaringClass().isInterface()
精准获取父类声明的抽象方法(含 protected/package-private)
若需包括非 public 的抽象方法(如 protected abstract void doWork();),getMethods() 无法覆盖。此时应遍历继承链,对每个父类调用 getDeclaredMethods():
- 从
clazz.getSuperclass()开始,向上递归获取父类 - 对每个父类
superCls,调用superCls.getDeclaredMethods() - 筛选出
Modifier.isAbstract(mod)且!Modifier.isPublic(mod)的方法(即 protected 或 package-private 抽象方法) - 遇到
Object.class或null停止递归
识别抽象方法所属的直接父类或间接祖先
抽象方法的 getDeclaringClass() 指向其首次声明处,不一定是直接父类。例如:A extends B,B extends C,抽象方法定义在 C 中,则子类 A 的该方法 getDeclaringClass() 返回 C.class。可据此还原完整声明路径:
- 对任一继承来的抽象方法
m,m.getDeclaringClass()即为其原始定义类 - 若需确认是否被中间父类重写(从而不再是抽象),可检查该父类中是否存在同签名的非抽象方法
- 用
superCls.getDeclaredMethod(m.getName(), m.getParameterTypes())尝试获取并判断其修饰符,避免误判
补充:抽象方法的签名与泛型信息
抽象方法的参数类型、返回类型、异常列表和泛型结构同样可通过反射提取:
-
m.getReturnType()获取返回类型;m.getGenericReturnType()获取带泛型的实际返回类型(如List<string></string>) -
m.getParameterTypes()返回原始参数类数组;m.getGenericParameterTypes()返回泛型参数类型数组 -
m.getExceptionTypes()和m.getGenericExceptionTypes()同理处理 throws 子句 - 若方法有注解(如
@Override或自定义注解),可用m.getAnnotation(...)或m.getDeclaredAnnotations()获取
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











