< prev index next >
src/java.base/share/classes/java/lang/invoke/MethodType.java
Print this page
rev 14309 : 8141536: MethodType field offset calculation could be lazy
Reviewed-by: vlivanov, mhaupt
@@ -1168,15 +1168,17 @@
private void MethodType_init(Class<?> rtype, Class<?>[] ptypes) {
// In order to communicate these values to readResolve, we must
// store them into the implementation-specific final fields.
checkRtype(rtype);
checkPtypes(ptypes);
- UNSAFE.putObject(this, rtypeOffset, rtype);
- UNSAFE.putObject(this, ptypesOffset, ptypes);
+ UNSAFE.putObject(this, OffsetHolder.rtypeOffset, rtype);
+ UNSAFE.putObject(this, OffsetHolder.ptypesOffset, ptypes);
}
- // Support for resetting final fields while deserializing
+ // Support for resetting final fields while deserializing. Implement Holder
+ // pattern to make the rarely needed offset calculation lazy.
+ private static class OffsetHolder {
private static final long rtypeOffset, ptypesOffset;
static {
try {
rtypeOffset = UNSAFE.objectFieldOffset
(MethodType.class.getDeclaredField("rtype"));
@@ -1184,10 +1186,11 @@
(MethodType.class.getDeclaredField("ptypes"));
} catch (Exception ex) {
throw new Error(ex);
}
}
+ }
/**
* Resolves and initializes a {@code MethodType} object
* after serialization.
* @return the fully initialized {@code MethodType} object
< prev index next >