2018-01-21 21:45:27 +01:00
|
|
|
package net.ME1312.SubServers.Host.Library;
|
|
|
|
|
|
|
|
import java.net.URL;
|
|
|
|
import java.net.URLClassLoader;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.Set;
|
|
|
|
import java.util.concurrent.CopyOnWriteArraySet;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Plugin ClassLoader Class
|
|
|
|
*/
|
|
|
|
public class PluginClassLoader extends URLClassLoader {
|
2018-02-19 23:59:51 +01:00
|
|
|
private static Set<PluginClassLoader> loaders = new CopyOnWriteArraySet<PluginClassLoader>();
|
|
|
|
private Class<?> defaultClass = null;
|
2018-01-21 21:45:27 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Load Classes from URLs
|
|
|
|
*
|
|
|
|
* @param urls URLs
|
|
|
|
*/
|
|
|
|
public PluginClassLoader(URL[] urls) {
|
|
|
|
super(urls);
|
2018-01-22 03:49:18 +01:00
|
|
|
loaders.add(this);
|
2018-01-21 21:45:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load Classes from URLs with a parent loader
|
|
|
|
*
|
|
|
|
* @param parent Parent loader
|
|
|
|
* @param urls URLs
|
|
|
|
*/
|
|
|
|
public PluginClassLoader(ClassLoader parent, URL... urls) {
|
|
|
|
super(urls, parent);
|
2018-01-22 03:49:18 +01:00
|
|
|
loaders.add(this);
|
2018-01-21 21:45:27 +01:00
|
|
|
}
|
|
|
|
|
2018-02-19 23:59:51 +01:00
|
|
|
public void setDefaultClass(Class<?> clazz) {
|
|
|
|
this.defaultClass = clazz;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Class<?> getDefaultClass() throws ClassNotFoundException {
|
|
|
|
if (defaultClass == null) {
|
|
|
|
throw new ClassNotFoundException();
|
|
|
|
} else {
|
|
|
|
return defaultClass;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private Class<?> getDefaultClass(String name) throws ClassNotFoundException {
|
|
|
|
try {
|
|
|
|
return getDefaultClass();
|
|
|
|
} catch (ClassNotFoundException e) {
|
|
|
|
throw new ClassNotFoundException(name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-21 21:45:27 +01:00
|
|
|
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
|
|
|
|
return this.loadClass(name, resolve, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
private Class<?> loadClass(String name, boolean resolve, boolean check) throws ClassNotFoundException {
|
|
|
|
try {
|
|
|
|
return super.loadClass(name, resolve);
|
2018-02-19 23:59:51 +01:00
|
|
|
} catch (NoClassDefFoundError | ClassNotFoundException e) {
|
2018-01-21 21:45:27 +01:00
|
|
|
if (check) {
|
2018-01-22 03:49:18 +01:00
|
|
|
Iterator i = loaders.iterator();
|
2018-01-21 21:45:27 +01:00
|
|
|
|
|
|
|
while (true) {
|
|
|
|
PluginClassLoader loader;
|
|
|
|
do {
|
|
|
|
if (!i.hasNext()) {
|
2018-02-19 23:59:51 +01:00
|
|
|
return getDefaultClass(name);
|
2018-01-21 21:45:27 +01:00
|
|
|
}
|
|
|
|
loader = (PluginClassLoader) i.next();
|
|
|
|
} while (loader == this);
|
|
|
|
|
|
|
|
try {
|
|
|
|
return loader.loadClass(name, resolve, false);
|
2018-02-19 23:59:51 +01:00
|
|
|
} catch (NoClassDefFoundError | ClassNotFoundException ex) {}
|
2018-01-21 21:45:27 +01:00
|
|
|
}
|
|
|
|
} else {
|
2018-02-19 23:59:51 +01:00
|
|
|
return getDefaultClass(name);
|
2018-01-21 21:45:27 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|