-
Notifications
You must be signed in to change notification settings - Fork 23
order 属性详解
ray.zh edited this page Apr 21, 2023
·
3 revisions
结构体字段中的 order 属性声明顺序将会是实际段序列化顺序。该字段存在有以下意义:
- 显示声明可以避免随意字段顺序调整而造成的异常问题,通常显示申明更容易发现并定位问题
- 也是最重要的一点,java 反射获取的字段是不保证顺序的,这一点在jdk文档中有说明。具体参阅:
- https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getFields--
- https://stackoverflow.com/questions/5001172/java-reflection-getting-fields-and-methods-in-declaration-order
所以这里值得区一提的是, ordre 声明顺序 不一定等于字段定义顺序。
事实上框架在解析完所有字段后,将会再将所有字段按照order进行重新排序
所以最佳实践是:
虽然 order要求递增,但却是不必要求严格的 increment.
如以下定义:
@MagicClass() public class Student { @MagicField(order = 1, size = 10) private String name; @MagicField(order = 3) private long phone; @MagicField(order = 5, size = 3) private int[] bookids; // getter setter... }
这里字段之间的order进行了间隔, 如 1, 3, 5, 7, 9。这样方便后期协议修改或者大字段拆分时使用。