Während die meisten hier aufgeführten Lösungen entweder Hacks sind (vor JDK 9), schwer zu konfigurieren (Agenten) oder einfach nicht mehr funktionieren (nach JDK 9), finde ich es wirklich überraschend, dass niemand eine [klar dokumentierte Methode](https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ClassLoader.html#getSystemClassLoader()) .
Sie können einen benutzerdefinierten System Class Loader erstellen und dann tun, was Sie wollen. Keine Reflexion erforderlich und alle Klassen teilen sich denselben Classloader.
Fügen Sie beim Starten der JVM dieses Flag hinzu:
java -Djava.system.class.loader=com.example.MyCustomClassLoader
Der Classloader muss einen Konstruktor haben, der einen Classloader akzeptiert, der als sein Elternteil festgelegt werden muss. Der Konstruktor wird beim Start der JVM aufgerufen und der echte System-Classloader wird übergeben, die Hauptklasse wird vom benutzerdefinierten Loader geladen.
Um Gläser hinzuzufügen, rufen Sie einfach ClassLoader.getSystemClassLoader()
und übertragen Sie es auf Ihre Klasse.
Überprüfen Sie diese Implementierung für einen sorgfältig gestalteten Classloader. Bitte beachten Sie, dass Sie die add()
Methode auf öffentlich.