Java中根据对象名称字符串获取嵌套类对应force属性的实现方法
Java根据字符串入参获取对应force属性的最优实现方案
方案1:抽取公共接口+预定义映射(首推,类型安全、性能无损耗)
如果可以修改原有ActionTypes类的定义,优先选这个方案:
- 先定义公共接口封装获取force的行为
public interface ForceAccessible { Integer getForce(); }
- 调整
ActionTypes类的内部类实现接口,同时为所有私有属性补充公共getter方法
public static class ActionTypes { private Punch punch; private Kick kick; // 外层类属性getter public Punch getPunch() { return punch; } public Kick getKick() { return kick; } public static class Punch implements ForceAccessible { private Integer force; // 实现接口方法返回force @Override public Integer getForce() { return force; } } public static class Kick implements ForceAccessible { private Integer force; @Override public Integer getForce() { return force; } } }
- 预构建字符串到对应取值逻辑的映射,调用时直接匹配即可
// 映射可以定义为静态常量,全局复用避免重复创建 private static final Map<String, Function<ActionTypes, Integer>> ACTION_FORCE_MAPPER = Map.of( "punch", action -> action.getPunch().getForce(), "kick", action -> action.getKick().getForce() ); // 业务调用方法 public Integer getActionForce(ActionTypes actionData, String actionType) { Function<ActionTypes, Integer> forceGetter = ACTION_FORCE_MAPPER.get(actionType); if (forceGetter == null) { throw new IllegalArgumentException("不支持的动作类型:" + actionType); } return forceGetter.apply(actionData); }
这个方案所有逻辑都在编译期做类型校验,不会出现运行时属性找不到的问题,性能和普通方法调用完全一致,后续新增动作类型只要在映射里加一行配置即可,维护成本极低。
方案2:分支判断(适合无法修改原类定义的场景)
如果不能改动原有ActionTypes的代码,且已经有对应属性的getter方法,直接用switch或者if/else分支判断即可,逻辑直观清晰,性能远高于反射:
public Integer getActionForce(ActionTypes actionData, String actionType) { return switch (actionType) { case "punch" -> actionData.getPunch().getForce(); case "kick" -> actionData.getKick().getForce(); default -> throw new IllegalArgumentException("不支持的动作类型:" + actionType); }; }
如果使用的Java版本低于17不支持switch表达式,替换为普通switch语句或者if/else判断即可。
不推荐方案:反射
虽然通过反射可以直接读取私有属性的值,但是存在编译期无法校验属性合法性、性能差、类型不安全的问题,除非完全没有其他改造空间,否则不要使用反射实现。
内容的提问来源于stack exchange,提问作者scwubbywubby
相关产品推荐
相关产品推荐

