Index: vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java =================================================================== --- vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java (revision 658500) +++ vm/vmcore/src/kernel_classes/javasrc/java/lang/Class.java (working copy) @@ -22,6 +22,7 @@ import static org.apache.harmony.vm.ClassFormat.ACC_INTERFACE; import static org.apache.harmony.vm.ClassFormat.ACC_SYNTHETIC; +import java.io.Externalizable; import java.io.InputStream; import java.io.Serializable; import java.lang.annotation.Annotation; @@ -78,7 +79,16 @@ // TODO make it soft reference transient ReflectionData reflectionData; transient SoftReference softCache; + + static final Class SERIALIZABLE = Serializable.class; + static final Class EXTERNALIZABLE = Externalizable.class; + transient volatile boolean resolvedProperties = false; + + transient boolean isSerializable; + transient boolean isExternalizable; + transient boolean isPrimitive; + private GACache getCache() { GACache cache = null; if (softCache != null) { @@ -601,10 +611,28 @@ return reflectionData.isArray; } + private void resolveProperties(Class clazz) { + if (clazz.resolvedProperties) return; + clazz.isExternalizable = VMClassRegistry.isAssignableFrom(EXTERNALIZABLE, clazz); + clazz.isSerializable = VMClassRegistry.isAssignableFrom(SERIALIZABLE, clazz); + clazz.isPrimitive = VMClassRegistry.isPrimitive(clazz); + clazz.resolvedProperties = true; + } + /** * @com.intel.drl.spec_ref */ public boolean isAssignableFrom(Class clazz) { + resolveProperties(clazz); + + if (SERIALIZABLE.equals(this)) { + return clazz.isSerializable; + } + + if (EXTERNALIZABLE.equals(this)) { + return clazz.isExternalizable; + } + return VMClassRegistry.isAssignableFrom(this, clazz); } @@ -626,7 +654,8 @@ * @com.intel.drl.spec_ref */ public boolean isPrimitive() { - return VMClassRegistry.isPrimitive(this); + resolveProperties(this); + return isPrimitive; } /**