Javassist NotFoundException при получении java.Ио.Сериализуемый с JDK9
у меня есть следующий код:
private static CtClass resolveCtClass(String clazz) throws NotFoundException {
ClassPool pool = ClassPool.getDefault();
return pool.get( clazz );
}
при работе под JDK8, если этот метод вызывается с помощью java.io.Serializable
, он работает, но при запуске в среде JDK9 он выбрасывает NotFoundException
.
есть что-то, что я пропустил здесь?
2 ответов
этого больше не происходит с текущими сборками EA Java 9. Файлы классов теперь всегда можно найти, даже если они инкапсулированы в модуль.
это следствие инкапсуляции модуля Java 9, где неэкспортированные ресурсы больше не доступны через ClassLoader
API-интерфейс. Под одеялом Javassist вызывает
ClassLoader.getSystemClassLoader().findResource("java/io/Serializable.class");
чтобы получить файл класса для Serializable
. Затем он анализирует этот файл класса и представляет информацию аналогично API отражения Java, но без загрузки класса, так что его можно редактировать до загрузки.
до Java 8 этот файл класса был доступен, поскольку большинство загрузчиков классов полагаются на поиск файла класса перед его загрузкой, так что вышеупомянутый вызов вернул URL
указывая на файл. Начиная с Java 9, ресурсы именованных модулей доступны только через новый метод API findResource(String, String)
где второй аргумент называет модуль этого класса.
короткий ответ: Javassist больше не работает с Java 9 и ни один из его иждивении проектов будет. Это известная проблема С текущей реализацией Java 9 и, надеюсь, будет исправлено до выпуска.
(Я никогда не использовал Javassist, поэтому я просто стреляю в темноте, здесь...)
на документация ClassPool
говорит:
если
get()
вызывается на этом объекте, он ищет различные источники, представленныеClassPath
найти файл класса, а затем он создаетCtClass
объект, представляющий этот файл класса.
это, кажется, связано с концепцией пути класса. Глядя на ClassPath
и CtClass
поддерживает это предположение.
если это так, то Javassist может просто не подходить для просмотра совершенно нового JDK 9 модули.
если моя догадка верна, вы не должны быть в состоянии сделать любой класс JDK из пула. Это должно быть легко проверяемым.