1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.common;
20
21 import java.io.File;
22 import java.net.MalformedURLException;
23 import java.net.URL;
24 import java.net.URLClassLoader;
25 import java.util.Optional;
26
27 public class MCRClassTools {
28 private static volatile ClassLoader extendedClassLoader;
29
30 static {
31 updateClassLoader();
32 }
33
34 public static Object loadClassFromURL(String classPath, String className)
35 throws MalformedURLException, ReflectiveOperationException {
36 return loadClassFromURL(new File(classPath), className);
37 }
38
39 public static Object loadClassFromURL(File file, String className)
40 throws MalformedURLException, ReflectiveOperationException {
41 if (file.exists()) {
42 URL url = file.toURI().toURL();
43 URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { url },
44 Thread.currentThread().getContextClassLoader());
45 Class<?> clazz = urlClassLoader.loadClass(className);
46 return clazz.getDeclaredConstructor().newInstance();
47 }
48
49 return null;
50 }
51
52
53
54
55
56
57
58
59 public static <T> Class<? extends T> forName(String classname) throws ClassNotFoundException {
60 @SuppressWarnings("unchecked")
61 Class<? extends T> forName;
62 try {
63 forName = (Class<? extends T>) Class.forName(classname);
64 } catch (ClassNotFoundException cnfe) {
65 forName = (Class<? extends T>) Class.forName(classname, true, extendedClassLoader);
66 }
67 return forName;
68 }
69
70
71
72
73 public static ClassLoader getClassLoader() {
74 return extendedClassLoader;
75 }
76
77 public static void updateClassLoader() {
78 extendedClassLoader = Optional.ofNullable(Thread.currentThread().getContextClassLoader())
79 .orElseGet(MCRClassTools.class::getClassLoader);
80 }
81
82 }