JAXB反序列化直接访问私有属性?代码行为不符预期疑问
JAXB如何访问私有属性?为什么你的getter返回null但字段仍被填充?
这个问题其实涉及到JAXB核心的访问机制,我来给你拆解清楚:
核心原因:JAXB依赖反射+@XmlAccessorType配置直接操作字段
你的代码里的@XmlAccessorType(XmlAccessType.FIELD)是关键,结合Java反射机制,JAXB完全可以绕开getter/setter直接操作私有字段:
@XmlAccessorType(XmlAccessType.FIELD)的作用:
这个注解明确告诉JAXB,序列化/反序列化时优先直接操作类的字段,而不是通过getter/setter方法。不管字段是private还是public,JAXB都会以字段为核心进行数据读写,完全忽略getter/setter的逻辑——这就是为什么你在getLvs()里硬返回null,但私有lvs字段还是被填充了,因为JAXB根本没调用这个getter方法。反射打破访问权限限制:
JAXB的底层实现(比如Oracle的JAXB RI、EclipseLink MOXy)会通过Java反射API获取到类的私有Field对象,然后调用Field.setAccessible(true)来绕过Java的访问权限检查,之后就可以直接用Field.set()给私有字段赋值,用Field.get()读取字段值。整个过程完全不需要依赖public的getter/setter方法。
验证你的代码问题
如果把你的getLvs()方法修改为返回实际字段值:
public List<Lv> getLvs() { return this.lvs; // 替换原来的return null }
你会发现反序列化后调用getLvs()就能拿到JAXB填充的列表数据了——因为之前的null只是getter的返回值,和私有字段实际存储的内容无关。
内容的提问来源于stack exchange,提问作者Neok
相关产品推荐
相关产品推荐

