Verstehe ich richtig, dass es in JPMS immer nur ein unbenanntes Modul gibt?
Ja, es gibt ein unbenanntes Modul. Das unbenannte Modul ist dem bestehenden Konzept der unnamed package sehr ähnlich.
In Implementierungen der Java SE-Plattform, die ein hierarchisches Dateisystem zum Speichern von Paketen verwenden, besteht eine typische Strategie darin, jedem Verzeichnis ein unbenanntes Paket zuzuordnen; Es ist jeweils nur ein unbenanntes Paket beobachtbar, nämlich jenes, das dem "aktuellen Arbeitsverzeichnis" zugeordnet ist. Die genaue Bedeutung von "aktuelles Arbeitsverzeichnis" hängt vom Host-System ab.
Bedeutet es, dass Anwendungen, die vor Java9 und nicht aktualisiert Java9 entwickelt wurden, werden als eine unbenannte Modul geladen werden?
Ja, für diese Gläser auf dem Klassenpfad platziert würde als ein einziges unbenanntes Modul behandelt werden. Die bottom up migration mit dem Konzept der ungenannten Module veranschaulicht dies mit einem ähnlichen Beispiel wie:
Angenommen, zum Beispiel, dass die Anwendung über ursprünglich für Java SE 8, als eine Reihe von ähnlich benannten JAR-Dateien erstellt worden gezeigt hatte platziert auf der Klassenpfad. Wenn wir es unverändert auf Java SE 9 ausführen, werden die Typen in den JAR-Dateien im unbenannten Modul definiert.
Die eigentliche Frage, die hier entstehen können, ist Welche Klassenlader die unbenannte Modul zugeordnet ist? The State of Module System about unnamed module gibt stattdessen eine Klarstellung darüber.
Jede Klasse Loader, es stellt sich heraus, hat seine eigene einzigartige unbenannte Modul, , die durch die neuen ClassLoader::getUnnamedModule
Methode zurückgegeben wird. Wenn ein Klassenlader eine Art lädt, die nicht dann in einem benannten Modul definiert ist diese Art in diesem Laders unbenannte Modul betrachtet wird, dh die getModule
Methode des Class
Objekttyp wird zurückkehren sein unbenanntes Modul loader. Das Modul umgangssprachlich als „das unbenannte Modul“ bezeichnet ist, dann einfach das unbenannte Modul der Anwendung Class Loader, die Typen aus dem Classpath geladen wird, wenn sie in Pakete sind nicht durch jedes bekannte Modul definiert.
Die ClassLoader
revidiert in Java-9 besagt, dass:
Bootstrap class loader
:
Die Java-Laufzeit die folgenden integrierten Klasse Lader hat: Der integrierte Klassenlader der virtuellen Maschine ...
Platform class loader
: ... Um Modernisierung/übergeordnete Module zu ermöglichen die Plattform Class Loader definiert, und wo ein Upgrade Module lesen Module Klasse definiert Lader andere als die Plattform Class Loader und seine Vorfahren, dann die Platform Class Loader muss möglicherweise an andere Klassenlader delegieren, z. B. der Anwendung Klassenlader. Mit anderen Worten, Klassen in benannte Module, die für andere Klassenladeprogramme als die Plattformklasse definiert sind loader und ihre Vorfahren können für den Plattformklassenlader sichtbar sein.
System class loader
: Es ist auch als Anwendungsklasse Lader bekannt und unterscheidet sich von der Plattform Klassenlader. Das System Class Loader wird normalerweise verwendet, um Klassen für die Anwendung Klassenpfad, Modulpfad und JDK-spezifische Tools zu definieren. Die Plattformklasse loader ist ein Elternteil oder ein Vorgänger des Systemklassenladeprogramms, das alle Plattformklassen enthält.