如何加载指定jar中的类

URLClassLoader ucl = new URLClassLoader(new URL[] { new File("D:\\aaa\\abc.jar").toURI()
.toURL() }, Application.class.getClassLoader());


Class<?> cls = ucl.loadClass("com.test.Test");
Object o = cls.newInstance();






以上仅仅是解决了abc.jar没有调用其他jar包(同样不再CLASSPATH中)的情况,否则就需要修改系统类加载器,估计默认调用的都是系统类加载器,办法如下:


static URLClassLoader sysloader = (URLClassLoader) ClassLoader
.getSystemClassLoader();
static Class sysclass = URLClassLoader.class;
static Method method;


public static void addURL(URL u) throws IOException {
try {
if (method == null) {
Class[] cs = new Class[] { URL.class };
method = sysclass.getDeclaredMethod("addURL", cs);
method.setAccessible(true);
}
method.invoke(sysloader, new Object[] { u });
} catch (Exception ex) {
ex.printStackTrace();
}
}


但比较奇怪的是不能增加目录,只能一个jar一个jar的增加,比如
addURL(new File("D:\\aaa\\aaa.jar").toURL());
addURL(new File("D:\\aaa\\bbb.jar").toURL());
不知道为什么?








加载类和加载动态库是同样的道理,都得找到最终的那个文件,前者主要由虚拟机搞定,不管怎样,他们都有一些搜索路径,只要我们想办法改变其搜索路径,问题就解决了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值