我需要在运行时动态加载一个java类。为此,我使用 https://github.com/trung/InMemoryJavaCompiler .
我需要加载的类实现了一个接口(interface),该接口(interface)已经是我的应用程序的一部分(因此该接口(interface)由系统类加载器加载)。加载类后,我将其强制转换为接口(interface)。
更新:抱歉,我对 docker 的看法是错误的。这当然与 docker 无关,但事实上我是通过命令行启动应用程序的:java -jar ...
。当应用程序从 intellij 启动时它就可以工作。当它通过命令行启动时,当我尝试强制转换时会抛出 java.lang.ClassCastException 。
真实接口(interface)的类加载器是org.springframework.boot.loader.LaunchedURLClass Loader@2a84aee7,而动态加载接口(interface)的类加载器是sun.misc.Launcher$AppClassLoader@55f96302。感谢您帮助我找出问题。
我该怎么做才能确保使用相同的类加载器?
始终将自定义类加载器作为接口(interface)类加载器的子加载器是一个好主意吗:new DynamicClassLoader(MyInterface.class.getClassLoader())
?
最佳答案
是的,DynamicClassLoader
需要委托(delegate)给加载MyInterface
的ClassLoader。
new DynamicClassLoader(MyInterface.class.getClassLoader())
应该没问题。
关于使用自定义类加载器时出现 java.lang.ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39406918/