Ich möchte einen Java-Klassenlader finden oder erstellen, der nur Systemklassen lädt, wobei Klassen im anwendungsdefinierten Klassenpfad ausgeschlossen werden. Mein Ziel ist es, mit diesem Klassenlader einen Klassenlader zu erstellen, der aus einer bestimmten JAR-Datei lädt und Systemklassen mithilfe des Klassenladeprogramms system-only auflöst, aber nicht die Klassen aus der JAR-Datei mit Klassen, die von meiner Anwendung definiert werden.Benötigen Sie einen Java-Klassenlader nur für System
Bis jetzt habe ich keine Möglichkeit gefunden, einen System-only-Klassenlader zu erstellen, der keine privaten APIs verwendet oder Annahmen über die Java-Implementierung macht. Siehe Code unten, der in meiner aktuellen Umgebung funktioniert, aber unerwünschte Annahmen trifft.
Wenn es keine Möglichkeit gibt, einen implementierungsunabhängigen System-only-Klassenlader zu erstellen, gibt es einen Grund, warum nicht? Ist das, was ich versuche, eine schlechte Idee zu machen?
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/");
}
Warum versuchen Sie dies zu tun? Was versuchst du zu erreichen? – jtahlborn
@jtahlborn Er gab seine Gründe sehr klar: "Mein Ziel ist ..." – qqilihq
@qqilihq - nein, das OP beschrieb "was" er versuchte zu erreichen, nicht "warum" – jtahlborn