自定义ClassLoader,用于加载用户JAR包
最近在考虑C/S结构程序的软件自动升级的实现方式,比如QQ、飞信等都自动升级的功能。
自动升级模块虽然还没有编码完成,但是思路还是比较清晰的。
自动升级过程中,升级文件的JAR包是专门加载到程序中去的,因此,自定义一个ClassLoader,用于加载用户JAR包,就非常的重要了。
应用程序ClassLoader只提供了一个public Class<?> loadClass(String name) throws ClassNotFoundException 方法,没有提供加载JAR的方法。
URLClassLoader提供了一个protected void addURL(URL url)的方法,倒是可以加载JAR包,但苦于非public的。
经测试发现,AppClassLoader是URLClassLoader的子类。因此,我们完全可以利用URLClassLoader了哦。
- URLClassLoader system = (URLClassLoader) ClassLoader.getSystemClassLoader();
URLClassLoader system = (URLClassLoader) ClassLoader.getSystemClassLoader();
这样,我们可以通过反射得到addURL方法,在程序中加载我们自己的JAR包了。
整个源代码如下所示:
- /**
- * Copyright (c) YMCN Team
- * All rights reserved.
- */
- package com.aboy.toolkit.util;
- import java.io.File;
- import java.lang.reflect.Method;
- import java.net.URL;
- import java.net.URLClassLoader;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @author obullxl
- *
- * email: obullxl@163.com MSN: obullxl@hotmail.com QQ: 303630027
- *
- * Blog: http://obullxl.iteye.com
- */
- public final class ClassLoaderUtil {
- /** URLClassLoader的addURL方法 */
- private static Method addURL = initAddMethod();
- /** 初始化方法 */
- private static final Method initAddMethod() {
- try {
- Method add = URLClassLoader.class
- .getDeclaredMethod("addURL", new Class[] { URL.class });
- add.setAccessible(true);
- return add;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- private static URLClassLoader system = (URLClassLoader) ClassLoader.getSystemClassLoader();
- /**
- * 循环遍历目录,找出所有的JAR包
- */
- private static final void loopFiles(File file, List<File> files) {
- if (file.isDirectory()) {
- File[] tmps = file.listFiles();
- for (File tmp : tmps) {
- loopFiles(tmp, files);
- }
- } else {
- if (file.getAbsolutePath().endsWith(".jar") || file.getAbsolutePath().endsWith(".zip")) {
- files.add(file);
- }
- }
- }
- /**
- * <pre>
- * 加载JAR文件
- * </pre>
- *
- * @param file
- */
- public static final void loadJarFile(File file) {
- try {
- addURL.invoke(system, new Object[] { file.toURI().toURL() });
- System.out.println("加载JAR包:" + file.getAbsolutePath());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * <pre>
- * 从一个目录加载所有JAR文件
- * </pre>
- *
- * @param path
- */
- public static final void loadJarPath(String path) {
- List<File> files = new ArrayList<File>();
- File lib = new File(path);
- loopFiles(lib, files);
- for (File file : files) {
- loadJarFile(file);
- }
- }
- }
/**
* Copyright (c) YMCN Team
* All rights reserved.
*/
package com.aboy.toolkit.util; import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List; /**
* @author obullxl
*
* email: obullxl@163.com MSN: obullxl@hotmail.com QQ: 303630027
*
* Blog: http://obullxl.iteye.com
*/
public final class ClassLoaderUtil {
/** URLClassLoader的addURL方法 */
private static Method addURL = initAddMethod(); /** 初始化方法 */
private static final Method initAddMethod() {
try {
Method add = URLClassLoader.class
.getDeclaredMethod("addURL", new Class[] { URL.class });
add.setAccessible(true);
return add;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} private static URLClassLoader system = (URLClassLoader) ClassLoader.getSystemClassLoader(); /**
* 循环遍历目录,找出所有的JAR包
*/
private static final void loopFiles(File file, List<File> files) {
if (file.isDirectory()) {
File[] tmps = file.listFiles();
for (File tmp : tmps) {
loopFiles(tmp, files);
}
} else {
if (file.getAbsolutePath().endsWith(".jar") || file.getAbsolutePath().endsWith(".zip")) {
files.add(file);
}
}
} /**
* <pre>
* 加载JAR文件
* </pre>
*
* @param file
*/
public static final void loadJarFile(File file) {
try {
addURL.invoke(system, new Object[] { file.toURI().toURL() });
System.out.println("加载JAR包:" + file.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
} /**
* <pre>
* 从一个目录加载所有JAR文件
* </pre>
*
* @param path
*/
public static final void loadJarPath(String path) {
List<File> files = new ArrayList<File>();
File lib = new File(path);
loopFiles(lib, files);
for (File file : files) {
loadJarFile(file);
}
}
}
在程序中,只要使用上面最后两个方法,就可以加载自定义JAR包和一个目录中的所有JAR包了。
经本人测试,上面代码运行无误,能正常加载自定义JAR包。
欢迎指正~~~~~~~
自定义ClassLoader,用于加载用户JAR包的更多相关文章
- (转)自定义ClassLoader ----可以加载第三方jar包
package com.classloader.util; import java.io.IOException; import java.net.MalformedURLException; imp ...
- 加载所有jar包下指定文件
加载所有jar包下指定文件: 如spring中加载 META-INF/spring.handlers 加载 org.springframework.core.io.support.Properties ...
- Spark on Yarn运行时加载的jar包
spark on yarn运行时会加载的jar包有如下: spark-submit中指定的--jars $SPARK_HOME/jars下的jar包 yarn提供的jar包 spark-submit通 ...
- maven加载本地jar包到repository
maven加载本地jar到repository 这是一个常见场景,此处以本地opencv jar文件导入repository为例 1.Ubuntu下 mvn install:install-file ...
- 27 Java动态加载第三方jar包中的类
我加载的方法是://参数fileName是jar包的路径,processorName 是业务类的包名+类名public static A load(String fileName, String pr ...
- Gradle加载本地jar包
有时,我们需要的jar包不一定能在远程仓库中找到,这时我们需要加载本地的jar包. 加载单独的jar包 在项目底下添加libs目录,将jar包仍进libs目录 build.gradle配置如下: de ...
- maven无法加载本地jar包以及maven项目打包后本地jar包没有打进项目的问题解决办法
1.首先设置依赖项,这样maven就会把该路径下的jar包导入项目引用 <dependency> <groupId>DPSDK-Manager</groupId> ...
- maven加载第三方jar包
<dependency> <groupId>com.yeepay</groupId> <artifactId>yop-sdk</artifactI ...
- JVM自定义类加载器加载指定classPath下的所有class及jar
一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责 ...
随机推荐
- TF-IDF介绍
TF-IDF是什么 TF-IDF是一种统计方法,用以评估一个词对于一篇文章或语料库中一篇文章的重要性.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降. T ...
- Mac下Anaconda的安装和使用
前提 在刚接触python的时候我想大多数人都会面临一个问题,我到底是选择2还是3,因为现在网上好多的资料和视频项目中都还是用的2,我们跟着学习的时候肯定也是首先从2开始学的,但是我们心里肯定也担心学 ...
- Gulp的安装配置过程和一些小坑
谈谈gulp. 项目尾声,老师叫我去熟悉一下grunt前端自动化工具,第一次知道这种东西,我就查各种资料啊,发现grunt已经‘过时’了,大家都用gulp和webpack.我当然选择了配置最简单的gu ...
- Webservice返回SoapHeader
Webservice在请求中加入自定义的SoapHeader,比较常用的场景是在SoapHeader中携带用户登陆信息,由服务端进行身份验证.今天遇到一个需求,除了在请求时要携带SoapHeader外 ...
- 20155227 2016-2017-2 《Java程序设计》实验一 Java开发环境的熟悉(Windws + IDEA)实验报告
20155227 2016-2017-2 <Java程序设计>实验一 Java开发环境的熟悉(Windws + IDEA)实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: ...
- 20155334 2016-2017-2 《Java程序设计》第一周学习总结
20155334 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一章主要讲了Java的前世今生以及Java的三大平台(Java SE.Java EE.Ja ...
- 从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社
从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社 PPT链接: https://pan.baidu.com/s/1i5Jrr1N 视频链接: https: ...
- javaweb(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- 在 Symfony Command中自定义脚本把Excel数据导入到数据库中
// 注:只是在此做下记录,有兴趣的可以参考,不做实际教程文档 <?php/** * Created by IntelliJ IDEA. * User: davis * Date: 2019-0 ...
- Jmeter资源监控工具ServerAgent运行原理的一些研究
用过Jmeter的应该都了解,有个ServerAgent工具,放在linux或者windows服务器上开启服务后,在Jmeter中配置下监视器,就可以抓取到服务器的一些资源信息,抓取的主要是cpu.内 ...