Map lastKeyedByFieldKey = Collections.EMPTY_MAP;
for (final Iterator iter = superClasses.iterator(); iter.hasNext();) {
cls = (Class)iter.next();
if (!keyedByFieldNameCache.containsKey(cls)) {
final Map keyedByFieldName = new HashMap(lastKeyedByFieldName);
final Map keyedByFieldKey = new OrderRetainingMap(lastKeyedByFieldKey);
Field[] fields = cls.getDeclaredFields();
if (JVM.reverseFieldDefinition()) {
for (int i = fields.length >> 1; i-- > 0;) {
final int idx = fields.length - i - 1;
final Field field = fields[i];
fields[i] = fields[idx];
fields[idx] = field;
}
}
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
FieldKey fieldKey = new FieldKey(field.getName(), field
.getDeclaringClass(), i);
field.setAccessible(true);
Field existent = (Field)keyedByFieldName.get(field.getName());
if (existent == null
// do overwrite statics
|| ((existent.getModifiers() & Modifier.STATIC) != 0)
// overwrite non-statics with non-statics only
|| (existent != null && ((field.getModifiers() & Modifier.STATIC) == 0))) {
keyedByFieldName.put(field.getName(), field);
}
keyedByFieldKey.put(fieldKey, field);
}
keyedByFieldNameCache.put(cls, keyedByFieldName);
keyedByFieldKeyCache.put(cls, sorter.sort(type, keyedByFieldKey));
}
lastKeyedByFieldName = (Map)keyedByFieldNameCache.get(cls);