# HG changeset patch # User redestad # Date 1500374430 -7200 # Node ID 0b9499e86ee6da64258944308530f692b4cca205 # Parent 55e3ff5a7b086919faabefdb18c12e63ba4a65a4 8184603: Create ObjectStreamField signature lazily when possible Reviewed-by: rriggs, chegar, alanb, shade diff -r 55e3ff5a7b08 -r 0b9499e86ee6 jdk/src/java.base/share/classes/java/io/ObjectStreamField.java --- 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; } }