8198480: Improve ClassLoaders static init block
authormartin
Thu, 08 Feb 2018 17:25:56 -0800
changeset 48994 817e39d3a9e0
parent 48993 aef762ff9b23
child 48995 58bec53828ba
8198480: Improve ClassLoaders static init block Reviewed-by: alanb, mchung
src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java
--- a/src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java	Tue Feb 27 21:05:07 2018 +0100
+++ b/src/java.base/share/classes/jdk/internal/loader/ClassLoaders.java	Thu Feb 08 17:25:56 2018 -0800
@@ -54,39 +54,27 @@
     private static final PlatformClassLoader PLATFORM_LOADER;
     private static final AppClassLoader APP_LOADER;
 
-    /**
-     * Creates the built-in class loaders
-     */
+    // Creates the built-in class loaders.
     static {
-
         // -Xbootclasspath/a or -javaagent with Boot-Class-Path attribute
-        URLClassPath bcp = null;
-        String s = VM.getSavedProperty("jdk.boot.class.path.append");
-        if (s != null && s.length() > 0)
-            bcp = new URLClassPath(s, true);
+        String append = VM.getSavedProperty("jdk.boot.class.path.append");
+        BOOT_LOADER =
+            new BootClassLoader((append != null && append.length() > 0)
+                ? new URLClassPath(append, true)
+                : null);
+        PLATFORM_LOADER = new PlatformClassLoader(BOOT_LOADER);
 
-        // we have a class path if -cp is specified or -m is not specified.
-        // If neither is specified then default to -cp <working directory>
-        // If -cp is not specified and -m is specified, the value of
-        // java.class.path is an empty string, then no class path.
-        String mainMid = System.getProperty("jdk.module.main");
+        // A class path is required when no initial module is specified.
+        // In this case the class path defaults to "", meaning the current
+        // working directory.  When an initial module is specified, on the
+        // contrary, we drop this historic interpretation of the empty
+        // string and instead treat it as unspecified.
         String cp = System.getProperty("java.class.path");
-        if (mainMid == null) {
-            // no main module specified so class path required
-            if (cp == null) {
-                cp = "";
-            }
-        } else {
-            // main module specified, ignore empty class path
-            if (cp != null && cp.length() == 0) {
-                cp = null;
-            }
+        if (cp == null || cp.length() == 0) {
+            String initialModuleName = System.getProperty("jdk.module.main");
+            cp = (initialModuleName == null) ? "" : null;
         }
         URLClassPath ucp = new URLClassPath(cp, false);
-
-        // create the class loaders
-        BOOT_LOADER = new BootClassLoader(bcp);
-        PLATFORM_LOADER = new PlatformClassLoader(BOOT_LOADER);
         APP_LOADER = new AppClassLoader(PLATFORM_LOADER, ucp);
     }