博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 类加载 ——处理同一个类多个版本
阅读量:5929 次
发布时间:2019-06-19

本文共 2526 字,大约阅读时间需要 8 分钟。

hot3.png

这文章主要让大家在开发的时候能够加载不同版本类型的class。

问题

在很多开发的时候,我们需要到某个jar包的某个功能,或由于升级,或其他原因,并不总是向后兼容的,这时候我们就应该需要支持多个不同版本的库。 使用java自带的的加载器,并不能做到这个要求,java自带的 "loadClass"只加载一次,之后返回的就是类的引用了。

解决办法

使用其他的 ClassLoader 来加载所需jar; 下面是两种实现方法:

1.使用 URLClassLoader

URLClassLoader 这个类允许你通过URL加载jar或者为你的类指定一个具体的目录

example:

URLClassLoader clsLoader = URLClassLoader.newInstance(new URL[] {new URL("file:/C://Test/test.jar")});Class cls = clsLoader.loadClass("test.Main");Method method = cls.getMethod("main", String[].class);String[]params = new String[2]; method.invoke(null, (Object) params);

2.定义自己的类加载器

在java的类加载器(包括:URLClassLoader)会首先要求从他们的类中加载,你这里需要自定一个类处理器来指定路径,满足你的特殊需求。 下面是一个自定义类加载器的示例:

import java.net.URL;import java.net.URLClassLoader;import java.util.List;public class CustomClassLoader extends ClassLoader {    private ChildClassLoader childClassLoader;    public CustomClassLoader(List
classpath) { super(Thread.currentThread().getContextClassLoader()); URL[] urls = classpath.toArray(new URL[classpath.size()]); childClassLoader = new ChildClassLoader( urls, new DetectClass(this.getParent()) ); } @Override protected synchronized Class
loadClass(String name, boolean resolve) throws ClassNotFoundException { try { return childClassLoader.findClass(name); } catch( ClassNotFoundException e ) { return super.loadClass(name, resolve); } } private static class ChildClassLoader extends URLClassLoader { private DetectClass realParent; public ChildClassLoader( URL[] urls, DetectClass realParent ) { super(urls, null); this.realParent = realParent; } @Override public Class
findClass(String name) throws ClassNotFoundException { try { Class
loaded = super.findLoadedClass(name); if( loaded != null ) return loaded; return super.findClass(name); } catch( ClassNotFoundException e ) { return realParent.loadClass(name); } } } private static class DetectClass extends ClassLoader { public DetectClass(ClassLoader parent) { super(parent); } @Override public Class
findClass(String name) throws ClassNotFoundException { return super.findClass(name); } }}

转载于:https://my.oschina.net/u/265943/blog/292867

你可能感兴趣的文章
No module named yum错误的解决办法
查看>>
CentOS7下Elastic Stack 5.0日志分析系统搭建
查看>>
RabbitMQ .NET消息队列使用入门【简单示例】
查看>>
Select 语句
查看>>
awk命令介绍和常见使用方法
查看>>
BGP 路由汇总、路由汇聚
查看>>
linux服务系列之二:vsftp服务器全集
查看>>
Java本地文件操作(一)文件的创建、删除、重命名
查看>>
linux下的CPU平均负载
查看>>
万网云虚拟主机 添加 百度统计 检测 Robots 文件出现 403 错误
查看>>
执行shell出现bad interpreter:No such file or directory
查看>>
PyTorch入门教程
查看>>
VC++线程同步(二) Mutex互斥量的例子
查看>>
MySQL调优
查看>>
HA集群
查看>>
将日志记录在是mysql中,实现loganalyzer
查看>>
linux命令总结basename
查看>>
The ASPM issues on Linux 3.2 kernel
查看>>
利用sed把ip xxx.xxx.xxx.xxx转为xxx.xxx.xxx.0/24
查看>>
linux 修改系统时区
查看>>