Dies passiert nicht mehr mit den aktuellen EA-Builds von Java 9. Klassendateien sind jetzt immer lokalisierbar, auch wenn sie in einem Modul gekapselt sind.
Dies ist eine Konsequenz der Modulkapselung von Java 9, bei der nicht exportierte Ressourcen nicht mehr über die API
ClassLoader
verfügbar sind. Unter den Abdeckungen, ruft Javassist
ClassLoader.getSystemClassLoader().findResource("java/io/Serializable.class");
für Serializable
halten, die Klassendatei zu erhalten. Anschließend analysiert es diese Klassendatei und stellt die Informationen ähnlich wie die Java-Reflektions-API dar, ohne jedoch die Klasse so zu laden, dass sie vor dem Laden editiert werden kann.
Bis auf Java 8 war diese Klassendatei verfügbar, da die meisten Klassenlader darauf angewiesen sind, eine Klassendatei vor dem Laden zu suchen, sodass der obige Aufruf eine URL
zurückgab, die auf die Datei verweist. Seit Java 9 sind Ressourcen von benannten Modulen nur über die neue API-Methode findResource(String, String)
verfügbar, wobei die zweiten Argumente das Modul dieser Klasse benennen.
Die kurze Antwort ist: Javassist funktioniert nicht mehr mit Java 9 und keiner von
its dependant projects wird. Dies ist ein
known issue mit der aktuellen Java 9-Implementierung und wird hoffentlich vor der Veröffentlichung behoben werden.