1 package top.infra.test.classloader.multi;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.net.MalformedURLException;
6 import java.net.URL;
7 import java.net.URLClassLoader;
8 import java.util.Arrays;
9
10 public class LibrarySetClassLoader extends URLClassLoader {
11
12 private final ClassLoader classLoader;
13
14 public LibrarySetClassLoader(final ClassLoader classLoader, final String[] libraries) throws IOException {
15 super(toUrls(libraries), Integer.class.getClassLoader());
16 this.classLoader = classLoader;
17 }
18
19 public static URL[] toUrls(final String[] libraries) throws IOException {
20 return Arrays.stream(libraries).map((s) -> {
21 try {
22 if (s.startsWith("file:")) {
23 return new File(s.substring("file:".length())).toURI().toURL();
24 }
25 return new URL(s);
26 } catch (final MalformedURLException e) {
27 throw new RuntimeException(e);
28 }
29 }).toArray(URL[]::new);
30 }
31
32 @Override
33 public Class<?> loadClass(final String name) throws ClassNotFoundException {
34 try {
35 return super.loadClass(name);
36 } catch (final ClassNotFoundException e) {
37 return this.classLoader.loadClass(name);
38 }
39 }
40 }