Javassist с JDK 17

#java #javassist #java-17

Вопрос:

Javassist (версия 3.28.0-GA) перестал работать после обновления с JDK 11 до 17.

Вызов CtClass#toClass выдает следующую ошибку:

   ...
  Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @63e31ee
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:159)
at javassist.util.proxy.DefineClassHelper$JavaOther.defineClass(DefineClassHelper.java:213)
at javassist.util.proxy.DefineClassHelper$Java11.defineClass(DefineClassHelper.java:52)
at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:260)
at javassist.ClassPool.toClass(ClassPool.java:1240)
at javassist.CtClass.toClass(CtClass.java:1392)
 

Кто-нибудь знает обходной путь?

Комментарии:

1. Официальным API для добавления класса в существующий контекст является MethodHandles.Lookup.defineClass(…) . Поэтому вам нужна либо функция Javassist, которая определяет этот метод, либо вызовите toBytecode() CtClass и создайте соответствующий объект поиска самостоятельно.

Ответ №1:

Похоже, это хорошо известная проблема с Javassist и JDK 16 и более поздними версиями (https://github.com/jboss-javassist/javassist/issues/369).

Решение, указанное в билете, состоит в том, чтобы больше не использовать CtClass.toClass() это

Пожалуйста, больше не используйте ctClass.toClass() , попробуйте [использовать] ctClass.toClass(neigborClass) в качестве замены.