我创建了一个自定义类来动态地将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')
1条答案
按热度按时间waxmsbnn1#
您已经用agent和instrumentation标记了这个问题-所以您可能实际上对从 javaagent 向系统类加载器添加jar感兴趣。
Instrumentation
接口已经有一个受支持的方法来执行此操作:Instumentation.appendToSystemClassLoaderSearch
。通过使用这种受支持的方法,您可以避免反射解决方案所具有的所有问题-因为此方法是Java的一部分,它将被更新以考虑任何内部更改-保留其功能。