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 из пула. Это должно быть легко проверяемым.