You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:57:02