8184603: Create ObjectStreamField signature lazily when possible
Reviewed-by: rriggs, chegar, alanb, shade
--- a/jdk/src/java.base/share/classes/java/io/ObjectStreamField.java Mon Jul 17 23:12:15 2017 -0700
+++ b/jdk/src/java.base/share/classes/java/io/ObjectStreamField.java Tue Jul 18 12:40:30 2017 +0200
@@ -45,16 +45,18 @@
/** field name */
private final String name;
- /** canonical JVM signature of field type */
+ /** canonical JVM signature of field type, if given */
private final String signature;
/** field type (Object.class if unknown non-primitive type) */
private final Class<?> type;
+ /** lazily constructed signature for the type, if no explicit signature */
+ private String typeSignature;
/** whether or not to (de)serialize field values as unshared */
private final boolean unshared;
/** corresponding reflective field object, if any */
private final Field field;
/** offset of field value in enclosing field group */
- private int offset = 0;
+ private int offset;
/**
* Create a Serializable field with the specified type. This field should
@@ -91,8 +93,8 @@
this.name = name;
this.type = type;
this.unshared = unshared;
- signature = getClassSignature(type).intern();
- field = null;
+ this.field = null;
+ this.signature = null;
}
/**
@@ -106,7 +108,7 @@
this.name = name;
this.signature = signature.intern();
this.unshared = unshared;
- field = null;
+ this.field = null;
switch (signature.charAt(0)) {
case 'Z': type = Boolean.TYPE; break;
@@ -242,7 +244,7 @@
*/
// REMIND: deprecate?
public char getTypeCode() {
- return signature.charAt(0);
+ return getSignature().charAt(0);
}
/**
@@ -252,7 +254,7 @@
*/
// REMIND: deprecate?
public String getTypeString() {
- return isPrimitive() ? null : signature;
+ return isPrimitive() ? null : getSignature();
}
/**
@@ -284,7 +286,7 @@
*/
// REMIND: deprecate?
public boolean isPrimitive() {
- char tcode = signature.charAt(0);
+ char tcode = getTypeCode();
return ((tcode != 'L') && (tcode != '['));
}
@@ -320,7 +322,7 @@
* Return a string that describes this field.
*/
public String toString() {
- return signature + ' ' + name;
+ return getSignature() + ' ' + name;
}
/**
@@ -336,6 +338,17 @@
* that signature strings are returned for primitive fields as well).
*/
String getSignature() {
- return signature;
+ if (signature != null) {
+ return signature;
+ }
+
+ String sig = typeSignature;
+ // This lazy calculation is safe since signature can be null iff one
+ // of the public constructors are used, in which case type is always
+ // initialized to the exact type we want the signature to represent.
+ if (sig == null) {
+ typeSignature = sig = getClassSignature(type).intern();
+ }
+ return sig;
}
}