getClass().getField() creates a new Field instance every time and possibly
creates an Object[] as well. Now we cache the Field instances and look them up ourselves which will likely be much more efficient at only a small additional memory cost. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2805 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,11 +1,13 @@
|
|||||||
//
|
//
|
||||||
// $Id: DObject.java,v 1.66 2003/07/22 22:54:14 mdb Exp $
|
// $Id: DObject.java,v 1.67 2003/09/23 17:16:46 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.presents.dobj;
|
package com.threerings.presents.dobj;
|
||||||
|
|
||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
import com.samskivert.util.ListUtil;
|
import com.samskivert.util.ListUtil;
|
||||||
import com.samskivert.util.StringUtil;
|
import com.samskivert.util.StringUtil;
|
||||||
@@ -100,6 +102,13 @@ import com.threerings.presents.Log;
|
|||||||
*/
|
*/
|
||||||
public class DObject implements Streamable
|
public class DObject implements Streamable
|
||||||
{
|
{
|
||||||
|
public DObject ()
|
||||||
|
{
|
||||||
|
// introspect our fields into a sorted array
|
||||||
|
_fields = getClass().getFields();
|
||||||
|
Arrays.sort(_fields, FIELD_COMP);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the object id of this object. All objects in the system
|
* Returns the object id of this object. All objects in the system
|
||||||
* have a unique object id.
|
* have a unique object id.
|
||||||
@@ -459,7 +468,7 @@ public class DObject implements Streamable
|
|||||||
}
|
}
|
||||||
|
|
||||||
// now actually set the value
|
// now actually set the value
|
||||||
getClass().getField(name).set(this, value);
|
getField(name).set(this, value);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
String errmsg = "Attribute setting failure [name=" + name +
|
String errmsg = "Attribute setting failure [name=" + name +
|
||||||
@@ -479,7 +488,7 @@ public class DObject implements Streamable
|
|||||||
throws ObjectAccessException
|
throws ObjectAccessException
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return getClass().getField(name).get(this);
|
return getField(name).get(this);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
String errmsg = "Attribute getting failure [name=" + name + "].";
|
String errmsg = "Attribute getting failure [name=" + name + "].";
|
||||||
@@ -852,9 +861,34 @@ public class DObject implements Streamable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link Field} with the specified name or null if there
|
||||||
|
* is none such.
|
||||||
|
*/
|
||||||
|
protected final Field getField (String name)
|
||||||
|
{
|
||||||
|
int low = 0, high = _fields.length-1;
|
||||||
|
while (low <= high) {
|
||||||
|
int mid = (low + high) >> 1;
|
||||||
|
Field midVal = _fields[mid];
|
||||||
|
int cmp = midVal.getName().compareTo(name);
|
||||||
|
if (cmp < 0) {
|
||||||
|
low = mid + 1;
|
||||||
|
} else if (cmp > 0) {
|
||||||
|
high = mid - 1;
|
||||||
|
} else {
|
||||||
|
return midVal; // key found
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null; // key not found.
|
||||||
|
}
|
||||||
|
|
||||||
/** Our object id. */
|
/** Our object id. */
|
||||||
protected int _oid;
|
protected int _oid;
|
||||||
|
|
||||||
|
/** An array of our fields, sorted for efficient lookup. */
|
||||||
|
protected transient Field[] _fields;
|
||||||
|
|
||||||
/** A reference to our object manager. */
|
/** A reference to our object manager. */
|
||||||
protected transient DObjectManager _omgr;
|
protected transient DObjectManager _omgr;
|
||||||
|
|
||||||
@@ -887,4 +921,11 @@ public class DObject implements Streamable
|
|||||||
/** Indicates whether we want to be destroyed when our last subscriber
|
/** Indicates whether we want to be destroyed when our last subscriber
|
||||||
* is removed. */
|
* is removed. */
|
||||||
protected transient boolean _deathWish = false;
|
protected transient boolean _deathWish = false;
|
||||||
|
|
||||||
|
/** Used to sort and search {@link #_fields}. */
|
||||||
|
protected static final Comparator FIELD_COMP = new Comparator() {
|
||||||
|
public int compare (Object o1, Object o2) {
|
||||||
|
return ((Field)o1).getName().compareTo(((Field)o2).getName());
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user