使用自定义类加载器时出现 java.lang.ClassCastException

标签 java jvm classloader

我需要在运行时动态加载一个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/

相关文章:

java - 使用 Java 按住多个键的机器人

java - Java 中可以有 3 种不同类型的 HashMap 吗?

java - Java中类A继承类B时堆中发生了什么

java - 在运行时加载 JRuby 和 ClassLoader 泄漏

java - 我需要在 Java 中将 float 四舍五入到小数点后两位

java - JBoss EAP 7 java.lang.IllegalArgumentException 通过 Gradle 脚本配置 JBoss EAP 7 数据源的问题

java - 如果用户计算机上未安装 Java,如何在 JAR 文件中包含 JVM?

java - 我可以通过编程方式找出实例所在的 GC 代吗?

java - jar 中的类什么时候进入 PermGen

jpa - 在 OSGi 环境中,类路径和类加载器是如何设置的?