Spring Boot Java中通过反射如何获取嵌套对象的statusCode属性值
问题根因分析
当前反射逻辑仅遍历了方法返回对象的第一层直接声明字段,当碰到presSvcRs这类嵌套对象类型的字段时,没有做向下的层级解析,因此只会打印对象的默认哈希地址,无法获取到嵌套结构内部的statusCode变量值。
修复实现方案
- 改造现有单层遍历逻辑,替换为递归全层级字段解析的通用方法,碰到非空的嵌套对象时持续向下遍历,直到定位到目标
statusCode字段 - 增加边界判断:跳过String、基本类型包装类等不需要继续递归解析的类型,避免方法栈溢出
核心递归解析工具方法参考:
/** * 递归查找对象全层级下指定名称的字段值 * @param targetObj 待解析的目标对象 * @param targetFieldName 需要匹配的字段名(如statusCode) * @return 匹配到的字段值,未查询到返回null */ private Object getNestedFieldValue(Object targetObj, String targetFieldName) throws IllegalAccessException { if (targetObj == null) return null; // 跳过无需递归解析的基础类型 if (targetObj instanceof String || targetObj instanceof Number || targetObj instanceof Boolean) { return null; } Field[] declaredFields = targetObj.getClass().getDeclaredFields(); for (Field field : declaredFields) { field.setAccessible(true); // 命中目标字段直接返回取值 if (targetFieldName.equals(field.getName())) { return field.get(targetObj); } // 字段非空则递归向下解析嵌套层级 Object fieldValue = field.get(targetObj); if (fieldValue != null) { Object nestedValue = getNestedFieldValue(fieldValue, targetFieldName); if (nestedValue != null) { return nestedValue; } } } return null; }
原AOP拦截逻辑调整为:
Object obj = pjp.proceed(); // 直接调用递归方法查找全层级下的statusCode值 Object statusCodeVal = getNestedFieldValue(obj, "statusCode"); System.out.println("解析得到的statusCode值:" + statusCodeVal);
补充注意:如果业务结构中存在List、数组这类集合嵌套的场景,还需要在递归方法中增加集合元素的遍历逻辑,避免漏解析被集合包裹的对象字段。
内容的提问来源于stack exchange,提问作者Rafael Pereira
相关产品推荐
相关产品推荐

