changeset 16236:250e4a7eec3d

8170984: java.util.logging might force the initialization of ResourceBundle class too early. Reviewed-by: alanb
author dfuchs
date Fri, 09 Dec 2016 15:48:48 +0000
parents d5fae1e4ae74
children 91d2d3dee7b4
files src/java.logging/share/classes/java/util/logging/Level.java src/java.logging/share/classes/java/util/logging/Logger.java
diffstat 2 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.logging/share/classes/java/util/logging/Level.java	Fri Dec 09 10:17:27 2016 -0500
+++ b/src/java.logging/share/classes/java/util/logging/Level.java	Fri Dec 09 15:48:48 2016 +0000
@@ -79,8 +79,13 @@
     private static final String defaultBundle =
         "sun.util.logging.resources.logging";
 
-    private static final JavaUtilResourceBundleAccess RB_ACCESS =
-        SharedSecrets.getJavaUtilResourceBundleAccess();
+    // Calling SharedSecrets.getJavaUtilResourceBundleAccess()
+    // forces the initialization of ResourceBundle.class, which
+    // can be too early if the VM has not finished booting yet.
+    private static final class RbAccess {
+        static final JavaUtilResourceBundleAccess RB_ACCESS =
+            SharedSecrets.getJavaUtilResourceBundleAccess();
+    }
 
     /**
      * @serial  The non-localized name of the level.
@@ -286,7 +291,7 @@
         // or its defining class loader, if it's unnamed module,
         // of this Level instance that can be a custom Level subclass;
         Module module = this.getClass().getModule();
-        ResourceBundle rb = RB_ACCESS.getBundle(resourceBundleName,
+        ResourceBundle rb = RbAccess.RB_ACCESS.getBundle(resourceBundleName,
                 newLocale, module);
 
         final String localizedName = rb.getString(name);
--- a/src/java.logging/share/classes/java/util/logging/Logger.java	Fri Dec 09 10:17:27 2016 -0500
+++ b/src/java.logging/share/classes/java/util/logging/Logger.java	Fri Dec 09 15:48:48 2016 +0000
@@ -259,8 +259,13 @@
     private static final LoggerBundle NO_RESOURCE_BUNDLE =
             new LoggerBundle(null, null);
 
-    private static final JavaUtilResourceBundleAccess RB_ACCESS =
+    // Calling SharedSecrets.getJavaUtilResourceBundleAccess()
+    // forces the initialization of ResourceBundle.class, which
+    // can be too early if the VM has not finished booting yet.
+    private static final class RbAccess {
+        static final JavaUtilResourceBundleAccess RB_ACCESS =
             SharedSecrets.getJavaUtilResourceBundleAccess();
+    }
 
     // A value class that holds the logger configuration data.
     // This configuration can be shared between an application logger
@@ -2183,7 +2188,7 @@
         if (!useCallersModule || callerModule == null || !callerModule.isNamed()) {
             try {
                 Module mod = cl.getUnnamedModule();
-                catalog = RB_ACCESS.getBundle(name, currentLocale, mod);
+                catalog = RbAccess.RB_ACCESS.getBundle(name, currentLocale, mod);
                 catalogName = name;
                 catalogLocale = currentLocale;
                 return catalog;
@@ -2227,7 +2232,7 @@
             // Try with the caller's module
             try {
                 // Use the caller's module
-                catalog = RB_ACCESS.getBundle(name, currentLocale, callerModule);
+                catalog = RbAccess.RB_ACCESS.getBundle(name, currentLocale, callerModule);
                 catalogName = name;
                 catalogLocale = currentLocale;
                 return catalog;