在Java 9上运行应用程序时,在各种情况下都会发生此异常.某些库和框架(Spring,Hibernate,JAXB)特别容易出现这种情况.这是Javassist的一个例子:
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 @1941a8ff
at java.base/jdk.internal.reflect.Reflection.throwInaccessibleObjectException(Reflection.java:427)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:201)
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
at javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:102)
at javassist.util.proxy.FactoryHelper.toClass2(FactoryHelper.java:180)
at javassist.util.proxy.FactoryHelper.toClass(FactoryHelper.java:163)
at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:501)
at javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:486)
at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:422)
at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:394)
Run Code Online (Sandbox Code Playgroud)
消息说:
无法使受保护的最终java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte [],int,int,java.security.ProtectionDomain)抛出java.lang.ClassFormatError可访问:module java.base没有"打开java.lang"到未命名的模块@ 1941a8ff
可以做些什么来避免异常并使程序成功运行?
我在Java中使用Runtime.getRuntime().exec()命令来启动批处理文件,该批处理文件又启动Windows平台的另一个进程.
javaw.exe(Process1)
|___xyz.bat(Process2)
|___javaw.exe(Process3)
Run Code Online (Sandbox Code Playgroud)
Runtime.getRuntime().exec()返回一个具有destroy方法的Process对象,但是当我使用destroy()时,它只会杀死xyz.bat并使批处理文件的子进程悬空.
Java中是否有一种干净的方法来破坏以批处理为根的进程树?
*我不能使用任何自定义库\摆脱批处理文件以绕过问题