最近在考慮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
歡迎指正~~~~~~~