package jef.tools.resource; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; /** * 基于Classpath的资源加载器。 * 特点:在classpath的所有路径上搜索资源 * * 特殊功能: * <li>跳过jar包</li> * 当{setDirectoryOnly(true)}后,只在目录中搜索。 * 通过 * <li>可以指定用哪个classloader搜索</li> * * @author jiyi * */ public class ClasspathLoader extends AResourceLoader{ private boolean directoryOnly; /** * 使用的classLoader */ private List<ClassLoader> loaders; public ClasspathLoader(){ this(false); } public ClasspathLoader(boolean directoryOnly) { this.directoryOnly=directoryOnly; setDefaultClassLoader(); } public ClasspathLoader(boolean directoryOnly,ClassLoader... loaders) { this.directoryOnly=directoryOnly; if(loaders.length>0){ this.loaders=Arrays.asList(loaders); }else{ setDefaultClassLoader(); } } public URL getResource(String name) { if(name.startsWith("/"))name=name.substring(1); if(directoryOnly)name="./"+name; if(loaders!=null && loaders.size()>0){ for(ClassLoader loader:loaders){ URL res=loader.getResource(name); if(res!=null)return res; } } return null; } public List<URL> getResources(String name) { if(name.startsWith("/"))name=name.substring(1); if(directoryOnly)name="./"+name; Set<URL> result=new LinkedHashSet<URL>(); try{ if(loaders!=null && loaders.size()>0){ for(ClassLoader loader:loaders){ for(Enumeration<URL> e=loader.getResources(name);e.hasMoreElements();){ result.add(e.nextElement()); } } } }catch(IOException e){ throw new IllegalArgumentException(e.getMessage()); } return new ArrayList<URL>(result); } /** * 指定使用系统classloader查找 */ public void setSystemClassLoader(){ this.loaders=Arrays.asList(ClassLoader.getSystemClassLoader()); } /** * 指定查找资源的classloader * @param loader */ public void setClassLoaders(ClassLoader... loader){ this.loaders=Arrays.asList(loader); } /** * 指定查找资源的classpath使用默认的 */ public void setDefaultClassLoader(){ ClassLoader cl=Thread.currentThread().getContextClassLoader(); if(cl==null){ cl=ClasspathLoader.class.getClassLoader(); } this.loaders=Arrays.asList(cl); } public boolean isDirectoryOnly() { return directoryOnly; } public void setDirectoryOnly(boolean directoryOnly) { this.directoryOnly = directoryOnly; } }