Я хочу создать динамически загрузчик классов для выполнения сценария JSR223 в контролируемая среда, но терпящая неудачу,
Я пытаюсь удалить/добавить банки, используя текущий (родительский) ClassLoader, я попробовал решение Динамическое удаление банок из путь к классам
public class DistributionClassLoader extends ClassLoader { public DistributionClassLoader(ClassLoader parent) { super(parent); } private Map<String, ClassLoader> classLoadersByDistribution = Collections.synchronizedMap(new WeakHashMap<>()); private final AtomicReference<String> distribution = new AtomicReference<>(); @Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { final ClassLoader delegate = classLoadersByDistribution.get(distribution.get()); if (delegate != null) return Class.forName(name, true, delegate); throw new ClassNotFoundException(name); } public void addDistribution(String key, ClassLoader distributionClassLoader){ classLoadersByDistribution.put(key,distributionClassLoader); } public void makeDistributionActive(String key){distribution.set(key);} public void removeDistribution(String key){ final ClassLoader toRemove = classLoadersByDistribution.remove(key); } }
Но в него не вошли все мои баночки, в тесте эта работа
ClassLoader cl = this.getClass().getClassLoader();
Class cls = cl.loadClass("org.springframework.http.HttpStatus");
Но использование решения не находит класс
ClassLoader cl = new DistributionClassLoader(this.getClass().getClassLoader());
Class cls = cl.loadClass("org.springframework.http.HttpStatus");
Исключение:
java.lang.ClassNotFoundException: org.springframework.http.HttpStatus
at com.DistributionClassLoader.loadClass(DistributionClassLoader.java:24)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Как выбрать конкретные банки для добавления или удаления из ClassLoader?
ИЗМЕНИТЬ
Я могу загружать банки с помощью @czdepski answer но я все еще хочу удалить все/большинство классов, кроме JDK
Method sysMethod = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class}); sysMethod.setAccessible(true); sysMethod.invoke(sysLoader, new Object[]{url});