
name.remal.reflection.ClassLoaderUtils Maven / Gradle / Ivy
package name.remal.reflection;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import static name.remal.SneakyThrow.sneakyThrow;
@SuppressWarnings("JavaReflectionMemberAccess")
public class ClassLoaderUtils {
static class ClassLoaderWrapper extends ClassLoader {
public ClassLoaderWrapper(@Nonnull ClassLoader classLoader) {
super(classLoader);
}
@Nullable
public Package getPackageOrNull(@Nonnull String name) {
return this.getPackage(name);
}
}
@Nullable
public static Package getPackageOrNull(@Nonnull ClassLoader classLoader, @Nonnull String packageName) {
return new ClassLoaderWrapper(classLoader).getPackageOrNull(packageName);
}
private static final Method ADD_URL_METHOD;
static {
try {
ADD_URL_METHOD = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
ADD_URL_METHOD.setAccessible(true);
} catch (NoSuchMethodException e) {
throw sneakyThrow(e);
}
}
public static void addURLsToClassLoader(@Nonnull ClassLoader classLoader, @Nonnull URL... urls) {
if (0 == urls.length) return;
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
do {
if (classLoader instanceof URLClassLoader) {
synchronized (classLoader) {
for (URL url : urls) {
try {
ADD_URL_METHOD.invoke(classLoader, url);
} catch (IllegalAccessException | InvocationTargetException e) {
throw sneakyThrow(e);
}
}
}
return;
}
if (systemClassLoader == classLoader) break;
classLoader = classLoader.getParent();
if (null == classLoader) classLoader = systemClassLoader;
} while (true);
throw new IllegalStateException("New URL can't be added to system ClassLoader: " + systemClassLoader);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy