2016-06-18 35 views
6

Mam następujący kod:Javassist NotFoundException gdy coraz java.io.Serializable z JDK9

private static CtClass resolveCtClass(String clazz) throws NotFoundException { 
    ClassPool pool = ClassPool.getDefault(); 
    return pool.get(clazz); 
} 

Podczas pracy pod JDK8, jeśli ta metoda jest wywoływana za pomocą java.io.Serializable, to działa, ale kiedy uruchomiony w środowisku JDK9 , rzuca NotFoundException.

Czy coś tu przeoczono?

Odpowiedz

6

Nie ma to już miejsca w aktualnych kompilacjach EA w języku Java 9. Pliki klas są teraz zawsze lokalizowalne, nawet jeśli są enkapsulowane w module.

Jest to konsekwencja enkapsulacji modułu Java 9, w której zasoby nie wyeksportowane nie są już dostępne za pośrednictwem interfejsu API ClassLoader. Pod kołdrą, Javassist wzywa

ClassLoader.getSystemClassLoader().findResource("java/io/Serializable.class"); 

zdobyć pliku klasy dla Serializable. Następnie analizuje ten plik klasy i reprezentuje informacje podobnie do interfejsu API Java Reflect, ale bez ładowania klasy, co umożliwia jej edycję przed załadowaniem.

Do wersji Java 8 ten plik klasy był dostępny, ponieważ większość programów ładujących klasy polega na wyszukiwaniu pliku klasy przed załadowaniem go tak, że powyższe wywołanie zwróciło URL wskazujące na plik. Od wersji Java 9 zasoby nazwanych modułów są dostępne tylko za pośrednictwem nowej metody API findResource(String, String), gdzie drugie argumenty nazywają moduł tej klasy.

Krótka odpowiedź brzmi: Javassist nie działa już z Javą 9 i żadna z wersji its dependant projects. Jest to known issue z obecną implementacją Java 9 i, mam nadzieję, zostanie poprawiony przed wydaniem.

1

(nigdy nie użyłem Javassist więc mam tylko zdjęcia w ciemności, oto ...)

documentation of ClassPool mówi:

Jeśli get() nazywany jest na tym obiekcie, przeszukuje różne źródła reprezentowane przez ClassPath, aby znaleźć plik klasy, a następnie tworzy obiekt CtClass reprezentujący ten plik klasy.

Wydaje się to być związane z pojęciem ścieżki klasowej. Patrząc na ClassPath i CtClass obsługuje to założenie.

Jeśli tak jest, to Javassist może nie być w stanie spojrzeć na nową wersję JDK 9 modules.

Jeśli moje przypuszczenie jest prawidłowe, nie powinieneś być w stanie uzyskać dowolnej klasy JDK z puli. To powinno być łatwe do sprawdzenia.