hotspot/test/runtime/testlibrary/ClassUnloadCommon.java
changeset 45825 4fa7bd62eb84
parent 35917 463d67f86eaa
--- a/hotspot/test/runtime/testlibrary/ClassUnloadCommon.java	Thu Aug 24 16:25:08 2017 +0200
+++ b/hotspot/test/runtime/testlibrary/ClassUnloadCommon.java	Wed Jul 05 13:25:45 2017 +0100
@@ -31,8 +31,10 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.stream.Stream;
 
 public class ClassUnloadCommon {
     public static class TestFailure extends RuntimeException {
@@ -61,14 +63,45 @@
         System.gc();
     }
 
+    /**
+     * Creates a class loader that loads classes from {@code ${test.class.path}}
+     * before delegating to the system class loader.
+     */
     public static ClassLoader newClassLoader() {
+        String cp = System.getProperty("test.class.path", ".");
+        URL[] urls = Stream.of(cp.split(File.pathSeparator))
+                .map(Paths::get)
+                .map(ClassUnloadCommon::toURL)
+                .toArray(URL[]::new);
+        return new URLClassLoader(urls) {
+            @Override
+            public Class<?> loadClass(String cn, boolean resolve)
+                throws ClassNotFoundException
+            {
+                synchronized (getClassLoadingLock(cn)) {
+                    Class<?> c = findLoadedClass(cn);
+                    if (c == null) {
+                        try {
+                            c = findClass(cn);
+                        } catch (ClassNotFoundException e) {
+                            c = getParent().loadClass(cn);
+                        }
+
+                    }
+                    if (resolve) {
+                        resolveClass(c);
+                    }
+                    return c;
+                }
+            }
+        };
+    }
+
+    static URL toURL(Path path) {
         try {
-            return new URLClassLoader(new URL[] {
-                Paths.get(System.getProperty("test.classes",".") + File.separatorChar + "classes").toUri().toURL(),
-            }, null);
-        } catch (MalformedURLException e){
-            throw new RuntimeException("Unexpected URL conversion failure", e);
+            return path.toUri().toURL();
+        } catch (MalformedURLException e) {
+            throw new RuntimeException(e);
         }
     }
-
 }