Java遍历String数组匹配类名后获取对应类静态字段的实现问题
推荐实现:静态映射表(优先选这个)
这种方式编译期可校验,性能更高,无需处理异常:
- 先在
CogsController类中新增静态映射表和初始化逻辑:
import java.util.HashMap; import java.util.Map; public class CogsController { // 原有变量保持不变 public static String[] cogSuits = {"Bossbot", "Lawbot", "Cashbot", "Sellbot"}; public static String[] bbCogNames = {"Flunky", "Pencil Pusher"}; public static String[] lbCogNames = {"Temp1", "Temp2"}; public static String[] cbCogNames = {"Temp3", "Temp4"}; public static String[] sbCogNames = {"Temp5", "Temp6"}; public static String[] cogNames[] = {bbCogNames, lbCogNames, cbCogNames, sbCogNames}; // 新增攻击属性映射表 public static final Map<String, int[][][]> COG_ATTACKS = new HashMap<>(); // 静态块初始化映射关系 static { COG_ATTACKS.put("Flunky", Flunky.attacks); COG_ATTACKS.put("Pencil Pusher", PencilPusher.attacks); COG_ATTACKS.put("Temp1", Temp1.attacks); COG_ATTACKS.put("Temp2", Temp2.attacks); COG_ATTACKS.put("Temp3", Temp3.attacks); COG_ATTACKS.put("Temp4", Temp4.attacks); COG_ATTACKS.put("Temp5", Temp5.attacks); COG_ATTACKS.put("Temp6", Temp6.attacks); } }
- 在Cog构造方法中匹配到
cogName后,直接取值即可:
// 匹配到cogName之后加这行 storedAttacks = CogsController.COG_ATTACKS.get(cogName); // 可以加个兜底逻辑避免空指针 if (storedAttacks == null) { storedAttacks = new int[0][][]; }
可选实现:反射(不推荐,仅满足字符串转类的需求)
如果一定要通过cogName动态获取类对象,可以用Java反射实现,注意要处理类名空格、包路径匹配和异常:
try { // 先处理cogName的空格,类名不允许有空格,比如"Pencil Pusher"要转为"PencilPusher" String className = cogName.replaceAll("\\s+", ""); // 替换为你实际的类所在的包名,比如所有cog类都在com.game.cogs包下就写"com.game.cogs." + className Class<?> clazz = Class.forName("你的完整包路径." + className); // 获取静态attacks字段 Field field = clazz.getField("attacks"); // 静态字段传null即可取值 storedAttacks = (int[][][]) field.get(null); } catch (Exception e) { e.printStackTrace(); // 异常兜底 storedAttacks = new int[0][][]; }
反射的缺点是运行时才会暴露类名错误、路径错误等问题,性能也远低于静态映射表,仅适合类数量极多、不方便手动维护映射的场景使用。
内容的提问来源于stack exchange,提问作者WesB
相关产品推荐
相关产品推荐

