如何遍历Class对象列表并调用各子类继承的共同静态方法
实现方案
按你提供的思路,修改以下几处错误即可实现需求:
- 修正父类非法语法:Java 不允许
static方法被abstract修饰,直接删除父类getType方法的abstract关键字即可,你也可以选择给父类方法添加默认实现,不影响后续子类同名静态方法的反射调用。 - 修正列表泛型声明:
Class<SomeGenericClass>只能接收SomeGenericClass.class本身,不能接收其子类的Class对象,需要将泛型改为Class<? extends SomeGenericClass>,通过上界通配符兼容所有子类的Class类型。 - 修正循环语法:移除循环内非法的强转语法,直接遍历通配符类型的Class元素即可,反射调用时正常获取方法执行即可。
修正后完整代码
类定义部分
// 父类修正:去掉非法的abstract修饰 public class SomeGenericClass { // 可保留默认实现,也可以直接删除这个方法,不影响子类同名静态方法的反射调用 public static String getType(){ return "default"; } } public class SomeSpecializedClassA extends SomeGenericClass{ public static String getType(){ return "I am of type A"; } } public class SomeSpecializedClassB extends SomeGenericClass{ public static String getType(){ return "I am of type B"; } }
主逻辑部分
import java.util.ArrayList; import java.util.List; import java.lang.reflect.Method; class Main{ // 反射调用会抛出受检异常,这里直接在main方法上抛出简化逻辑,也可以用try-catch包裹处理 public static void main(String[] args) throws Exception{ List<Class<? extends SomeGenericClass>> classes = new ArrayList<>(); classes.add(SomeSpecializedClassA.class); classes.add(SomeSpecializedClassB.class); for(Class<? extends SomeGenericClass> clazz : classes){ Method getTypeMethod = clazz.getMethod("getType"); // 静态方法调用第一个参数传null即可 String result = (String) getTypeMethod.invoke(null); System.out.println(result); } } }
运行输出
I am of type A I am of type B
内容的提问来源于stack exchange,提问作者Marvin
相关产品推荐
相关产品推荐

