内部静态 class 的新实例在前棒棒糖设备中具有不同顺序的变量

New instance of inner static class has variables in different order in pre-lollipop devices

我正在处理 android 应用程序现有代码库中的错误。我们有一个静态内部 class,如下所示:

public class MyOuterClass{

private MyInnerClass myInnerClassObject;
private int someOtherVariable;

// getter and setter of my inner class
public MyInnerClass getMyInnerClassObject(){
return myInnerClassObject;
}

public void setMyInnerClassObject(MyInnerClass myInnerClassObject){
this.myInnerClassObject = myInnerClassObject;
}

public static class MyInnerClass{

private int variable1;
private int variable2;
private int variable 3;
...

// here are getters and setters for above variables in same order which I have skipped.

}

现在调用上面代码的地方如下:

private MyInnerClass getMyInnerClassObject(AnotherObject anotherObject){

MyInnerClass myInnerClassObject = new MyInnerClass();
myInnerClassObject.setFirstVariable(anotherObject.getFirstValue);
myInnerClassObject.setSecondVariable(anotherObject.getSecondValue);
myInnerClassObject.setThirdVariable(anotherObject.getThirdValue);
...
return myInnerClassObject;
}

上面函数返回的这个对象按照它形成的顺序映射到XML。问题出现在那里。 当 运行 这段代码在 Android 版本高于或等于 lollipop 的设备中时,在 Android Studio 的调试模式下看到的这些变量的顺序与我们拥有的相同在代码中定义。 但是当 运行 相同的代码在 Android 版本低于 lollipop 的设备(如 Kitkat)中时,会观察到一个奇怪的现象。通过 Android Studio 的调试器查看相同对象时,这些变量的顺序完全不同。

这给我带来了问题,因为映射中在棒棒糖之前的设备中形成的我的 Web 服务请求 XML 具有不同顺序的元素,因此给我带来了问题。

造成这种奇怪现象的原因是什么? Android 静态内部 classes 调用在不同版本中是否有不同的行为?

出于代码保密原因,我更改了变量的名称和 classes。希望我试图解释的流程是清楚的。如有任何澄清,请随时发表评论。

This object returned in the above function is mapped into XML in the order it is formed.

这真是个糟糕的主意。

What is the reason of this strange phenomenon?

您使用的生成方法有缺陷 XML。

Does Android have different behaviors for static inner classes call in different versions?

A​​FAIK,编译后的代码不需要按任何特定顺序具有其字段和其他成员。此外,其他工具(例如 ProGuard)可能会在处理过程中更改顺序。