java - 迁移到 java11 ClassCastException
问题描述
我有一个曾经在我的 java 程序中使用的库。
它包含下一行:
URLClassLoader cl = (URLClassLoader) ClassLoader.getSystemClassLoader();
它在 java8 上工作正常,但是在我尝试在 java11 上启动它之后,我得到了 ClassCastException
java.lang.ClassCastException:类 jdk.internal.loader.ClassLoaders$AppClassLoader 不能转换为类 java.net.URLClassLoader
是否可以在不修改库的情况下解决此问题?AFAIK,Java 应该是向后兼容的,所以也许一些命令行参数可能会有所帮助?
谢谢
解决方案
Java 是向后兼容的。ClassLoader.getSystemClassLoader()
在 Java 8中查看表明它返回的是ClassLoader
-instance,而不是URLClassLoader
-instance。ClassLoader.getSystemClassLoader()
在 Java 11 中也是如此。因此,从来没有任何保证会ClassLoader.getSystemClassLoader()
返回URLClassLoader
.
据我所知,没有办法将 a 转换为ClassLoader
a URLClassLoader
。解决此问题的唯一正确方法是编写库的维护人员并告诉他们他们依赖于一些实现细节,他们不应该这样做并要求他们解决问题。如果这是一个简单的修复并且项目是开源的,您可以分叉项目,修复问题并创建拉取请求。
推荐阅读
- c++ - 我的递归有问题吗?
- spring-boot - 运行 Springboot 测试用例时如何避免加载可自动配置的类
- docker - 如何在 Kubernetes Dashboard 中配置基于 Kubeconfig 的登录
- javascript - JavaScript中如何计算变量占用的内存?
- powershell - 如何同时安装 Powershell 模块?
- javascript - 在 mouseleave 事件上关闭 daterangepicker
- swift - 如何在从 firebase 获取值时更改 NavBar 标题颜色
- php - 如何在共享服务器(GoDaddy)上部署 Laravel-Vue 项目
- python - python ECDSA和C micro-ecc库之间的ECDSA签名和验证问题
- android - anko bg的替代品是什么?