8184603: Create ObjectStreamField signature lazily when possible
Reviewed-by: rriggs, chegar, alanb, shade
This commit is contained in:
parent
5547e32641
commit
c50c7fefc5
@ -45,16 +45,18 @@ public class ObjectStreamField
|
|||||||
|
|
||||||
/** field name */
|
/** field name */
|
||||||
private final String name;
|
private final String name;
|
||||||
/** canonical JVM signature of field type */
|
/** canonical JVM signature of field type, if given */
|
||||||
private final String signature;
|
private final String signature;
|
||||||
/** field type (Object.class if unknown non-primitive type) */
|
/** field type (Object.class if unknown non-primitive type) */
|
||||||
private final Class<?> 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 */
|
/** whether or not to (de)serialize field values as unshared */
|
||||||
private final boolean unshared;
|
private final boolean unshared;
|
||||||
/** corresponding reflective field object, if any */
|
/** corresponding reflective field object, if any */
|
||||||
private final Field field;
|
private final Field field;
|
||||||
/** offset of field value in enclosing field group */
|
/** 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
|
* Create a Serializable field with the specified type. This field should
|
||||||
@ -91,8 +93,8 @@ public class ObjectStreamField
|
|||||||
this.name = name;
|
this.name = name;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.unshared = unshared;
|
this.unshared = unshared;
|
||||||
signature = getClassSignature(type).intern();
|
this.field = null;
|
||||||
field = null;
|
this.signature = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -106,7 +108,7 @@ public class ObjectStreamField
|
|||||||
this.name = name;
|
this.name = name;
|
||||||
this.signature = signature.intern();
|
this.signature = signature.intern();
|
||||||
this.unshared = unshared;
|
this.unshared = unshared;
|
||||||
field = null;
|
this.field = null;
|
||||||
|
|
||||||
switch (signature.charAt(0)) {
|
switch (signature.charAt(0)) {
|
||||||
case 'Z': type = Boolean.TYPE; break;
|
case 'Z': type = Boolean.TYPE; break;
|
||||||
@ -242,7 +244,7 @@ public class ObjectStreamField
|
|||||||
*/
|
*/
|
||||||
// REMIND: deprecate?
|
// REMIND: deprecate?
|
||||||
public char getTypeCode() {
|
public char getTypeCode() {
|
||||||
return signature.charAt(0);
|
return getSignature().charAt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -252,7 +254,7 @@ public class ObjectStreamField
|
|||||||
*/
|
*/
|
||||||
// REMIND: deprecate?
|
// REMIND: deprecate?
|
||||||
public String getTypeString() {
|
public String getTypeString() {
|
||||||
return isPrimitive() ? null : signature;
|
return isPrimitive() ? null : getSignature();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -284,7 +286,7 @@ public class ObjectStreamField
|
|||||||
*/
|
*/
|
||||||
// REMIND: deprecate?
|
// REMIND: deprecate?
|
||||||
public boolean isPrimitive() {
|
public boolean isPrimitive() {
|
||||||
char tcode = signature.charAt(0);
|
char tcode = getTypeCode();
|
||||||
return ((tcode != 'L') && (tcode != '['));
|
return ((tcode != 'L') && (tcode != '['));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,7 +322,7 @@ public class ObjectStreamField
|
|||||||
* Return a string that describes this field.
|
* Return a string that describes this field.
|
||||||
*/
|
*/
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return signature + ' ' + name;
|
return getSignature() + ' ' + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -336,6 +338,17 @@ public class ObjectStreamField
|
|||||||
* that signature strings are returned for primitive fields as well).
|
* that signature strings are returned for primitive fields as well).
|
||||||
*/
|
*/
|
||||||
String getSignature() {
|
String getSignature() {
|
||||||
|
if (signature != null) {
|
||||||
return signature;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user