我有一个要求,必须根据从 UI 捕获分布的分布来更改 jar。
一组与另一组的分布各不相同。如果选择了某个发行版,则必须以动态/编程方式将与该发行版相关的 jar 添加到类路径中。
如果选择另一个发行版,则必须动态地从类路径中删除添加到类路径的先前 jar,并且必须动态添加与新发行版相关的新 jar。对于其他发行版,必须继续执行相同操作。
我已经看到早期的线程指出可以通过类加载器在运行时添加 jar,但我还没有看到任何可以从类路径动态删除 jar 的线程。
谁能建议这是否可能?
一种简单的方法是将类加载器委托给特定于发行版的类加载器。这是此类的草稿:
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);
}
}
然而,仍然存在几个问题:当切换发行版时,我们希望从以前的发行版中卸载所有类。我认为没有办法实现这一目标。另外:如果您对委托类加载器创建的对象有任何引用,这些对象将保留对其类加载器的引用。我不确定是否有合适的解决方案,但这可能会让您开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)