< 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 >