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