对复杂Java POJO 字段赋值
背景
上周遇到了一个安全需求,要求外部接口不能返回手机号字段。难点在于,外部接口和内部接口调用的是同一个方法,所以只能在接口返回的地方做处理逻辑。当时为了快速上线,用的办法是把手机号字段取出,置为null,然后再set回去。因为接口返回的POJO比较复杂,嵌套层级多,所以这个办法不优雅。
问题来了,假设有一个复杂的POJO对象,如何快速给某个字段赋值,而不需要关心对象嵌套关系呢?
解决方法
使用了Java的反射
public static void setField(Object obj, String fieldName, Object target) throws IllegalAccessException { // 取出所有字段,包括 public 和 private var fields = obj.getClass().getDeclaredFields(); for (java.lang.reflect.Field field : fields) { // 设置为可访问 field.setAccessible(true); var o = field.get(obj); // 如果是目标字段,则设置为目标值 if (field.getName().equals(fieldName)) { field.set(obj, target); return; } // 如果是基本数据类型,就直接跳过 if (o.getClass().getClassLoader() == null) { continue; } else { // 如果是引用数据类型,就进行递归调用,直到遍历完所有字段或找到目标字段 setField(o, fieldName, target); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?