< prev index next >
src/java.base/share/classes/sun/invoke/util/Wrapper.java
Print this page
rev 13019 : 8141678: sun.invoke.util.Wrapper eagerly initializes all integral type caches
Reviewed-by: TBD
@@ -23,19 +23,23 @@
* questions.
*/
package sun.invoke.util;
+import java.lang.reflect.Field;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
+
public enum Wrapper {
// wrapperType primitiveType char zero emptyArray format
- BOOLEAN( Boolean.class, boolean.class, 'Z', (Boolean)false, new boolean[0], Format.unsigned( 1)),
+ BOOLEAN( Boolean.class, boolean.class, 'Z', Boolean.FALSE, new boolean[0], Format.unsigned( 1)),
// These must be in the order defined for widening primitive conversions in JLS 5.1.2
- BYTE ( Byte.class, byte.class, 'B', (Byte)(byte)0, new byte[0], Format.signed( 8)),
- SHORT ( Short.class, short.class, 'S', (Short)(short)0, new short[0], Format.signed( 16)),
- CHAR (Character.class, char.class, 'C', (Character)(char)0, new char[0], Format.unsigned(16)),
- INT ( Integer.class, int.class, 'I', (Integer)/*(int)*/0, new int[0], Format.signed( 32)),
- LONG ( Long.class, long.class, 'J', (Long)(long)0, new long[0], Format.signed( 64)),
+ BYTE ( Byte.class, byte.class, 'B', getZero(Byte.class), new byte[0], Format.signed( 8)),
+ SHORT ( Short.class, short.class, 'S', getZero(Short.class), new short[0], Format.signed( 16)),
+ CHAR (Character.class, char.class, 'C', getZero(Character.class), new char[0], Format.unsigned(16)),
+ INT ( Integer.class, int.class, 'I', getZero(Integer.class), new int[0], Format.signed( 32)),
+ LONG ( Long.class, long.class, 'J', getZero(Long.class), new long[0], Format.signed( 64)),
FLOAT ( Float.class, float.class, 'F', (Float)(float)0, new float[0], Format.floating(32)),
DOUBLE ( Double.class, double.class, 'D', (Double)(double)0, new double[0], Format.floating(64)),
OBJECT ( Object.class, Object.class, 'L', null, new Object[0], Format.other( 1)),
// VOID must be the last type, since it is "assignable" from any other type:
VOID ( Void.class, void.class, 'V', null, null, Format.other( 0)),
@@ -59,10 +63,25 @@
this.format = format;
this.wrapperSimpleName = wtype.getSimpleName();
this.primitiveSimpleName = ptype.getSimpleName();
}
+ private static Object getZero(Class<?> clazz) {
+ try {
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+ @Override
+ public Object run() throws Exception {
+ Field field = clazz.getDeclaredField("ZERO");
+ field.setAccessible(true);
+ return field.get(null);
+ }
+ });
+ } catch (Exception e) {
+ throw new InternalError("Could not get ZERO constant from " + clazz);
+ }
+ }
+
/** For debugging, give the details of this wrapper. */
public String detailString() {
return wrapperSimpleName+
java.util.Arrays.asList(wrapperType, primitiveType,
basicTypeChar, zero,
< prev index next >