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条答案
按热度按时间qyzbxkaa1#
这似乎是Javassist和JDK 16及更高版本(https://github.com/jboss-javassist/javassist/issues/369)的一个众所周知的问题。
票证中提到的解决方案是不再使用
CtClass.toClass()
:请不要再使用
ctClass.toClass()
,尝试[使用]ctClass.toClass(neigborClass)
作为替代。