Description
Consider test case [1], RI and Harmony's beans will generate different results [2] [3].
Using the given MockObjectPersistenceDelegate, RI will write the "inst" instance of MockObject as a field,
while current Harmony's beans will write this instance by using reflection method Class.getField(...).
This is due to the missing condition in the XMLEncoder.flushStatField(...) method.
[1]
public class XMLEncoderTest extends TestCase {
public void test_WriteObject_StaticField()
public static class MockObject
{ public static MockObject inst = new MockObject(); } public static class MockObjectPersistenceDelegate extends
PersistenceDelegate {
protected Expression instantiate(Object oldInstance, Encoder enc) {
Expression exp = null;
try {
exp = new Expression(MockObject.class.getField("inst"), "get",
new Object[]
);
} catch (Exception e)
return exp;
}
}
}
[2] RI's XML:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_05" class="java.beans.XMLDecoder">
<object class="tests.java.beans.XMLEncoderTest$MockObject" field="inst"/>
</java>
[3] Harmony's XML
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0" class="java.beans.XMLDecoder">
<object class="tests.java.beans.XMLEncoderTest$MockObject" method="getField">
<string>inst</string>
</object>
</java>