Javassist NotFoundException при получении java.io.Serializable с помощью JDK9

У меня есть следующий код:

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

При работе в JDK8, если этот метод вызывается с использованием java.io.Serializable, он работает, но при работе в среде JDK9 выдает ошибку NotFoundException.

Есть ли что-то, что я упустил из виду?


person Naros    schedule 18.06.2016    source источник


Ответы (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, и мы быть исправлено до выпуска.

person Rafael Winterhalter    schedule 19.06.2016

(Я никогда не использовал Javassist, поэтому я просто снимаю в темноте, вот...)

В документации ClassPool говорится:

Если для этого объекта вызывается get(), он ищет различные источники, представленные ClassPath, чтобы найти файл класса, а затем создает объект CtClass, представляющий этот файл класса.

Кажется, это связано с концепцией пути к классу. Глядя на ClassPath и CtClass поддерживает это предположение.

Если это так, то Javassist может просто не подойти для изучения нового модули.

Если мое предположение верно, вы не сможете получить какой-либо класс JDK из пула. Это должно быть легко проверяемо.

person Nicolai Parlog    schedule 18.06.2016