--- 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);
}
}
-
}