JVM类加载器应用之多版本库支持
2021/4/28 18:27:03
本文主要是介绍JVM类加载器应用之多版本库支持,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
问题
开发过程中,咱们经常需要使用不同的库版本,而这些版本又不是向后兼容的,或者出于某种原因需要支持同一库的多个版本。
在这种情况下,默认的类加载器已经是不支持了,因为 loadClass
方法只加载一次特定的类,之后所有的加载请求就直接返回现有 Class 实例的引用了。
解决办法
在这种情况下,可以自定义一个类加载器,用这个具有优先设置的加载器加载需要的库就可以了。
基本代码如下:
1 import java.net.URL; 2 import java.net.URLClassLoader; 3 import java.util.List; 4 5 public class CustomClassLoader extends ClassLoader { 6 private ChildClassLoader childClassLoader; 7 8 public CustomClassLoader(List<URL> classpath) { 9 10 super(Thread.currentThread().getContextClassLoader()); 11 URL[] urls = classpath.toArray(new URL[classpath.size()]); 12 childClassLoader = new ChildClassLoader(urls, new DetectClass(this.getParent())); 13 } 14 15 @Override 16 protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { 17 try { 18 return childClassLoader.findClass(name); 19 } catch(ClassNotFoundException e) { 20 return super.loadClass(name, resolve); 21 } 22 } 23 24 private static class ChildClassLoader extends URLClassLoader { 25 private DetectClass realParent; 26 27 public ChildClassLoader(URL[] urls, DetectClass realParent) { 28 super(urls, null); 29 this.realParent = realParent; 30 } 31 32 @Override 33 public Class<?> findClass(String name) throws ClassNotFoundException { 34 try { 35 Class<?> loaded = super.findLoadedClass(name); 36 if(loaded != null) return loaded; 37 return super.findClass(name); 38 } catch(ClassNotFoundException e) { 39 return realParent.loadClass(name); 40 } 41 } 42 } 43 44 private static class DetectClass extends ClassLoader { 45 public DetectClass(ClassLoader parent) { 46 super(parent); 47 } 48 49 @Override 50 public Class<?> findClass(String name) throws ClassNotFoundException { 51 return super.findClass(name); 52 } 53 } 54 }
All Done!
至此就算完成了,通过这种解决办法就可以使单个 jvm 中有多个库版本,或者同一个版本中由于静态变量导致的多实例共存了。
注意:有些库中可能还加载了一些 classpath 下的资源文件,这种情况下就按需要覆盖 getResource 等方法就可以了。
这篇关于JVM类加载器应用之多版本库支持的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)