java.lang.ClassCastException 使用自定义类加载器时
java.lang.ClassCastException when using custom classloader
我需要在运行时动态加载 java class。为此,我使用 https://github.com/trung/InMemoryJavaCompiler.
我需要加载的 class 实现了一个接口,该接口已经是我的应用程序的一部分(因此该接口由 system-classloader 加载)。 class加载后,我把它投到界面上。
更新:抱歉,我错了docker。这当然与 docker 无关,但与我通过命令行启动应用程序这一事实有关:java -jar ...
。当应用程序从 intellij 启动时,它可以工作。当它通过命令行启动时 java.lang.ClassCastException 在我尝试投射时抛出。
真实界面的class加载器为org.springframework.boot.loader.LaunchedURLClassLoader@2a84aee7,动态加载界面的class加载器为sun.misc.Launcher$AppClassLoader@55f96302。感谢您帮我找出问题所在。
我该怎么做才能确保使用相同的 class 加载程序?
始终使自定义 class 加载程序成为接口 class 加载程序的子项是否是个好主意:new DynamicClassLoader(MyInterface.class.getClassLoader())
?
是的,DynamicClassLoader
需要委托给加载MyInterface
的ClassLoader。
new DynamicClassLoader(MyInterface.class.getClassLoader())
应该没问题。
我需要在运行时动态加载 java class。为此,我使用 https://github.com/trung/InMemoryJavaCompiler.
我需要加载的 class 实现了一个接口,该接口已经是我的应用程序的一部分(因此该接口由 system-classloader 加载)。 class加载后,我把它投到界面上。
更新:抱歉,我错了docker。这当然与 docker 无关,但与我通过命令行启动应用程序这一事实有关:java -jar ...
。当应用程序从 intellij 启动时,它可以工作。当它通过命令行启动时 java.lang.ClassCastException 在我尝试投射时抛出。
真实界面的class加载器为org.springframework.boot.loader.LaunchedURLClassLoader@2a84aee7,动态加载界面的class加载器为sun.misc.Launcher$AppClassLoader@55f96302。感谢您帮我找出问题所在。
我该怎么做才能确保使用相同的 class 加载程序?
始终使自定义 class 加载程序成为接口 class 加载程序的子项是否是个好主意:new DynamicClassLoader(MyInterface.class.getClassLoader())
?
是的,DynamicClassLoader
需要委托给加载MyInterface
的ClassLoader。
new DynamicClassLoader(MyInterface.class.getClassLoader())
应该没问题。