使用自定义类加载器

时间:2016-09-09 08:16:38

标签: java jvm classloader

我需要在运行时动态加载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())

1 个答案:

答案 0 :(得分:1)

是的,DynamicClassLoader需要委托加载MyInterface的ClassLoader。

new DynamicClassLoader(MyInterface.class.getClassLoader())应该没问题。