アプリケーションクラスパスのクラスを除いて、システムクラスのみを読み込むJavaクラスローダを見つけたり作成したりしたいと思います。私の目標は、特定のJARファイルからロードするクラスローダーを構築し、システム専用のクラスローダーを使用してシステムクラスを解決し、アプリケーションによって定義されたクラスでJARファイルのクラスを汚染しないようにすることです。Javaシステムのみのクラスローダーが必要
これまで私はプライベート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/");
}
なぜこれをやろうとしていますか?あなたは何を達成しようとしていますか? – jtahlborn
@jtahlborn彼は非常に明確に理由を述べた: "私の目標は..." – qqilihq
@qqilihq - いいえ、OPは "何"を達成しようとしていたのか "理由" – jtahlborn