⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 managedurlclassloader.java

📁 树形的java classloader,树形的java classloader,树形的java classloader,
💻 JAVA
字号:
package org.codehaus.classloader;

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;

/**
 * This class loader will delegate to the ClassLoaderManager object when a class or resource
 * is not found within the realm of itself.
 * <p>
 * @author Ben Yu
 * Aug 2, 2006 9:53:38 PM
 */
public class ManagedURLClassLoader extends URLClassLoader implements ClassProvider{
  private final ClassLoaderManager man;
  
  private final ThreadLocal current_manager = new ThreadLocal(){
    protected Object initialValue() {
      return getManager();
    }
  };
  /*
  private final HashMap cache = new HashMap();
  private Class getCachedClass(String name){
    synchronized(cache){
      final WeakReference ref = (WeakReference)cache.get(name);
      if(ref==null)
        return null;
      return (Class)ref.get();
    }
  }
  private void cacheClass(String name, Class cls){
    synchronized(cache){
      cache.put(name, new WeakReference(cls));
    }
  }
  */
  private ClassLoaderManager getCurrentManager() {
    return (ClassLoaderManager)current_manager.get();
  }
  private void resetCurrentManager(){
    current_manager.set(man);
  }
  private void clearCurrentManager(){
    current_manager.set(NilClassLoaderManager.instance());
  }
  
  public ClassLoaderManager getManager(){
    return man;
  }

  public ManagedURLClassLoader(ClassLoaderManager man, URL[] urls, ClassLoader parent) {
    super(urls, parent);
    this.man = man;
  }

  public ManagedURLClassLoader(ClassLoaderManager man, URL[] urls) {
    super(urls);
    this.man = man;
  }
  protected Class loadClass(String name, boolean resolve)
      throws ClassNotFoundException {
    //System.out.println("loading "+name+" by "+this);
    /*final Class cached = getCachedClass(name);
    if(cached!=null){
      //System.out.println("cache hit");
      return cached;
    }*/
    try{
      return super.loadClass(name, resolve);
    }
    catch(ClassNotFoundException e){
      final Class cls = getCurrentManager().lookupClass(this, name);
      //cacheClass(name, cls);
      //System.out.println("save in cache");
      return cls;
    }
  }
  public URL getResource(String name) {
    URL url = super.getResource(name);
    if(url==null)
      url = getCurrentManager().lookupResource(this, name);
    return url;
  }

  /*
   * more ideal to override getResources in order to avoid super class calls back down.
   * But getResources() is final below 1.4. So have to use findResources and utilize thread local
   * to temporarily disable looking up for when the super class looks back down.
   */
  public Enumeration findResources(String name) throws IOException {
    return new ConcatEnumeration(super.findResources(name), getCurrentManager().lookupResources(this, name));
  }

/*
  protected Package getPackage(String name) {
    Package pkg = super.getPackage(name);
    if(pkg==null){
      pkg = getCurrentManager().lookupPackage(this, name);
    }
    return pkg;
  }

  protected Package[] getPackages() {
    final ArrayList buf = new ArrayList();
    buf.addAll(Arrays.asList(super.getPackages()));
    buf.addAll(Arrays.asList(getCurrentManager().lookupPackages(this)));
    final Package[] result = new Package[buf.size()];
    buf.toArray(result);
    return result;
  }
*/
  protected String findLibrary(String libname) {
    String result = super.findLibrary(libname);
    if(result==null){
      result = getCurrentManager().lookupLibrary(this, libname);
    }
    return result;
  }

  public Class provideClass(String name) throws ClassNotFoundException {
    return super.loadClass(name, false);
    /*
    clearCurrentManager();
    try{
      return super.loadClass(name, false);
    }
    finally{
      resetCurrentManager();
    }*/
  }

  public String provideLibrary(String libname) {
    clearCurrentManager();
    try{
      return super.findLibrary(libname);
    }
    finally{
      resetCurrentManager();
    }
  }
/*
  public Package[] providePackages() {
    clearCurrentManager();
    try{
      return super.getPackages();
    }
    finally{
      resetCurrentManager();
    }
  }

  public Package providePackage(String name) {
    clearCurrentManager();
    try{
      return super.getPackage(name);
    }
    finally{
      resetCurrentManager();
    }
  }
*/
  public URL provideResource(String name) {
    clearCurrentManager();
    try{
      return super.getResource(name);
    }
    finally{
      resetCurrentManager();
    }
  }

  public Enumeration provideResources(String name) throws IOException {
    clearCurrentManager();
    try{
      return super.getResources(name);
    }
    finally{
      resetCurrentManager();
    }
  }
  public String toString() {
    StringBuffer buf = new StringBuffer();
    buf.append(getClass().getName());
    buf.append(" - [");
    URL[] urls = super.getURLs();
    for(int i=0; i<urls.length; i++){
      if(i>0)
        buf.append(";");
      buf.append(urls[i]);
    }
    buf.append("]");
    return buf.toString();
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -