最近在考虑C/S结构程序的软件自动升级的实现方式,好比QQ、飞信等都自动升级的功能。java
自动升级模块虽然尚未编码完成,可是思路仍是比较清晰的。oop
自动升级过程当中,升级文件的JAR包是专门加载到程序中去的,所以,自定义一个ClassLoader,用于加载用户JAR包,就很是的重要了。测试
应用程序ClassLoader只提供了一个public Class<?> loadClass(String name) throws ClassNotFoundException 方法,没有提供加载JAR的方法。编码
URLClassLoader提供了一个protected void addURL(URL url)的方法,却是能够加载JAR包,但苦于非public的。url
经测试发现,AppClassLoader是URLClassLoader的子类。所以,咱们彻底能够利用URLClassLoader了哦。spa
URLClassLoader system = (URLClassLoader) ClassLoader.getSystemClassLoader();
这样,咱们能够经过反射获得addURL方法,在程序中加载咱们本身的JAR包了。.net
整个源代码以下所示:code
/** * 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包了。blog
经本人测试,上面代码运行无误,能正常加载自定义JAR包。ip
欢迎指正~~~~~~~