2016-05-31 9 views
20

Ich habe gerade angefangen, mir das Java 9-Modulsystem anzusehen, und ich habe mich gefragt, ob es für eine Klasse möglich ist zu wissen, in welchem ​​Modul sie sich befindet.Methode getModule gibt unbenanntes Modul für die Klasse im benannten Modul zurück

Dafür habe ich das folgende Modul

module de.test { 
    exports de.test.myexport; 
} 

und eine JAR-Datei zusammengestellt, die

> jar --print-module-descriptor --file=Java9Test-1.0-SNAPSHOT.jar         

de.test 
    requires mandated java.base 
    exports de.test.myexport 

In Paket de.test wie

aussieht, habe ich eine Klasse Overview genannt, wo ich bin Aufruf

Module module = Overview.class.getModule(); 

Das zurückgegebene Modulobjekt ist jedoch unbenannt und hat keine ModuleDescriptor.

Ich verwende getModule() hier richtig, oder gibt es eine andere Möglichkeit, das Modul einer Klasse zu laden?

Ich bin mit JDK 9 Build 120 auf OS X.

+1

WOW, Java9 wird von Stiftung Warentest getestet [:-) –

Antwort

17

Alle JAR-Dateien im Klassenpfad (mit java --class-path ...) in die gleiche gebündelt erhalten sogenannte unnamed module, unabhängig davon, ob sie „ein echtes Modul“ oder "nur ein JAR". Wenn Sie eine Klasse aus einer solchen JAR für ihr Modul fragen, erhalten Sie das Ergebnis, das Sie beschreiben.

Versuchen Sie, das JAR auf den Modulpfad zu setzen (mit java --module-path ...) und Class::getModule sollte zurückgeben, was Sie erwarten.

+3

Danke, es hat genau so funktioniert, wie du es beschrieben hast. Für mich scheint es jedoch nicht wahrheitsgemäß intuitiv zu sein, dass sich 'Class :: getModule' anders verhält, je nachdem, wie eine Klasse ausgeführt wird. –