Benötigen Sie einen Java-Klassenlader nur für Java

8

Ich möchte einen Java-Klassenladeprogramm suchen oder erstellen, das 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, Systemklassen mit dem System-only-Klassenlader auflöst, aber nicht die Klassen aus der JAR-Datei mit Klassen, die von meiner Anwendung definiert werden / p>

Bis jetzt habe ich noch 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 keinen Weg gibt, einen implementierungsunabhängigen Nur-System-Klassenlader zu erstellen, gibt es einen Grund, warum nicht? Ist das, was ich versuche, eine schlechte Idee zu tun?

%Vor%     
Alan Snyder 05.12.2015, 04:24
quelle

1 Antwort

1

Sie müssen den übergeordneten ClassLoader als Bootstrap ClassLoader definieren. Rufen Sie getClassLoader() in einem java.lang.String-Objekt auf, um den Bootstrap-Klassenlader abzurufen und diesen in Ihrem ClassLoader-Konstruktor zu verwenden.

%Vor%

Die Darstellung des Bootstrap-Classloaders ist als implementierungsabhängig dokumentiert.

  

Einige Implementierungen verwenden möglicherweise null, um den Bootstrap-Klassenlader darzustellen. Diese Methode [getClassLoader] gibt in solchen Implementierungen null zurück, wenn diese Klasse vom Bootstrap-Klassenlader geladen wurde.

Derselbe Wortlaut gilt jedoch für den übergeordneten ClassLoader im ClassLoader-Konstruktor, was bedeutet, dass diese Lösung portierbar ist.

    
Neil Masson 05.12.2015 05:29
quelle

Tags und Links