zhangxiaochuan 发表于 2013-2-3 14:19:13

自定义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();

这样,我们可以通过反射得到addURL方法,在程序中加载我们自己的JAR包了。

整个源代码如下所示:

/**   * created since 2011-3-8 * All rights reserved.   */    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;   /*** 加载指定路径jar包工具类 * @author xiaochuan.zhang * @version $Id: ClassLoaderUtil.java, v 0.1 2011-3-10 下午 */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包了。
页: [1]
查看完整版本: 自定义ClassLoader, 加载用户JAR包