我想找到或创建一个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) 大多数关于通配符的问题都想知道为什么编译器会拒绝一些合理的东西。我的问题是相反的。为什么下面的程序会被编译器接受?
void test(List<? extends Number> g1, List<? extends Number> g2)
{
g1 = g2;
}
Run Code Online (Sandbox Code Playgroud)
我试图从 Java 语言规范中解释这一点,但我还没有找到答案。我从 Java 泛型和通配符的各种描述中得到的印象是,通配符的每次使用都被捕获为一种全新的类型,但显然不是在这里。我没有发现允许此分配后出现任何令人讨厌的行为,但它似乎仍然是“错误的”。