字段访问模式
上回中提到writer.mode,这是字段访问模式标识,可能取值定义为
FieldMode 字段模式
PropertyMode 属性模式
MemberMode 成员模式
模式是选取类成员变量的一种规则。成员选择由Accessors类来完成。
1. FieldMode
getFields()方法实现FieldMode规则。
选取规则:遍历type及type的祖先类,对于类层次中的每个类,调getDeclaredFields()方法,选择所有成员变量,但需要排除掉静态成员变量以及用transient修饰的变量。
如:
按照FieldMode的规则,只能选取到f1, f2, f4。
2. PropertyMode
getProperties()方法实现PropertyMode 规则。
95-108行,找到以 set打头的方法,这个方法不能是静态的,不能有返回值,且只能有一个参数。
109-110行,找到满足条件的方法后,截取方法名,即将set去掉,得到一个属性名,再由属性名,调
findGetter(Method[] methods, String name, Class
paramType),得到这个属性的get方法。
最终由属性的get, set方法组成属性访问器。
如:
按照PropertyMode 规则,会找到setF1方法,去掉方法名中的set,则剩下F1,再调
findGetter,找到 getF1(), 或isF1()这样的方法。
setF2因有返回值被排除掉,setF3因是静态的被排除掉,setF4因没有参数被排除掉。
3. MemberMode
getMembers ()方法实现MemberMode 规则。
182-198行,找到以set,get方法修饰的变量,这段与PropertyMode 模式类似
207-214行,找到类clazz的所有的public成员变量,包括其祖先类的。
如:
按照MemberMode 规则,会找到f1, f3这2个变量,而f2由于不是public变量,又没有set,get方法,因此不会选择到。
以上3种模式,定义了成员变量的选择规则,这在序列化时会用到。因为序列化时,总有需求说,哪些字段需要序列化,哪些不需要序列化。可以根据实际需要,从中选择不同的模式。
留言与评论(共有 0 条评论) |