我想找到或创建一个Java类加载器,它只加载系统类,不包括应用程序定义的类路径上的任何类.我的目标是使用类加载器来构建从一个特定的JAR文件加载,使用唯一的系统级解决加载系统类,但不能从与我的应用程序定义的任何类的JAR文件污染类的类加载器.
到目前为止,我还没有找到任何方法来创建一个只使用系统的类加载器,它不使用私有API或对Java实现做出假设.请参阅下面的代码,该代码适用于我当前的环境,但会做出不合适
如果没有办法创建一个独立于系统的实现类加载器,有没有理由呢?是我想做一个坏主意?
private ClassLoader createJarClassLoader(File f)
{
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
if (systemClassLoader instanceof URLClassLoader) {
URLClassLoader cl = (URLClassLoader) systemClassLoader;
URL[] urls = cl.getURLs();
List<URL> wantedURLs = new ArrayList<>();
for (URL u : urls) {
if (isSystemURL(u)) {
wantedURLs.add(u);
}
}
try {
wantedURLs.add(f.toURI().toURL());
} catch (MalformedURLException ex) {
return null;
}
return new URLClassLoader(wantedURLs.toArray(new URL[0]), null);
}
return null;
}
private boolean isSystemURL(URL u)
{
return u.getPath().contains("/jre/");
}
Run Code Online (Sandbox Code Playgroud)
您需要将父类加载器设置为引导类加载器。调用getClassLoader()java.lang.String 对象来获取引导类加载器并在类加载器构造函数中使用它。
public class MyClassLoader extends URLClassLoader {
protected MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}
static MyClassLoader getInstance(URL[] urls) {
ClassLoader parent = "".getClass().getClassLoader();
return (new MyClassLoader(urls, parent));
}
}
Run Code Online (Sandbox Code Playgroud)
引导类加载器的表示被记录为依赖于实现
某些实现可能使用 null 来表示引导类加载器。如果此类是由引导类加载器加载的,则此方法 [getClassLoader] 将在此类实现中返回 null。
但同样的措辞适用于 ClassLoader 构造函数中的父 ClassLoader,这意味着该解决方案是可移植的。
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |