jdk.internal.loader.ClassLoaders$AppClassLoader与java.net.URLClassLoader(j8 - j11)不兼容

flseospp  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(371)

我创建了一个自定义类来动态地将URL添加到类加载器中。

void addURL(URL url) {
         try {
             Class<?>[] parameters = new Class[]{URL.class};
             Class<?> sysclass = URLClassLoader.class;
             Method method = sysclass.getDeclaredMethod("addURL", parameters);
             method.setAccessible(true);

             URLClassLoader sysloader = (URLClassLoader) (getClass().getClassLoader());
             while (sysloader != null) {
                 method.invoke(sysloader, url);
                 sysloader = (URLClassLoader) sysloader.getParent();
             }
         }catch (Exception e) {
             e.printStackTrace();
         }
          }

然后我尝试用下面的方法添加url
String filePath =“jar path”;

File file = new File(filePath);
URL url = file.toURI().toURL();
    CustomClassLoader customURLClassLoader = new CustomClassLoader();
    customURLClassLoader.addURL(url);

我得到以下异常

java.lang.ClassCastException: class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap')
waxmsbnn

waxmsbnn1#

您已经用agentinstrumentation标记了这个问题-所以您可能实际上对从 javaagent 向系统类加载器添加jar感兴趣。
Instrumentation接口已经有一个受支持的方法来执行此操作:Instumentation.appendToSystemClassLoaderSearch
通过使用这种受支持的方法,您可以避免反射解决方案所具有的所有问题-因为此方法是Java的一部分,它将被更新以考虑任何内部更改-保留其功能。

相关问题