六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 24|回复: 0

自定义ClassLoader, 加载用户JAR包

[复制链接]

升级  10%

1

主题

1

主题

1

主题

童生

Rank: 1

积分
5
 楼主| 发表于 2013-2-3 14:19:13 | 显示全部楼层 |阅读模式
应用程序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包了。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表