package com.geccocrawler.gecco.dynamic; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class GeccoClassLoader extends ClassLoader { private static final Log LOG = LogFactory.getLog(GeccoClassLoader.class); private Map<String, Class<?>> classes; private static GeccoClassLoader instance; /** * 创建一个新的GeccoClassLoader * @return GeccoClassLoader */ public static synchronized GeccoClassLoader create() { if(instance != null) { instance.classes.clear(); } ClassLoader parent = Thread.currentThread().getContextClassLoader(); if(parent != null) { instance = new GeccoClassLoader(parent); } else { instance = new GeccoClassLoader(); } return instance; } public static synchronized GeccoClassLoader get() { if(instance == null) { instance = create(); } return instance; } public GeccoClassLoader() { classes = new HashMap<String, Class<?>>(); } public GeccoClassLoader(ClassLoader parent) { super(parent); classes = new HashMap<String, Class<?>>(); } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { Class<?> clazz = classes.get(name); if(clazz == null) { throw new ClassNotFoundException(name); } LOG.debug("find from GeccoClassLoader : " + name); return clazz; } @Override public Class<?> loadClass(String name) throws ClassNotFoundException { LOG.debug("load from GeccoClassLoader : " + name); return super.loadClass(name); } public void addClass(String key, Class<?> clazz) { classes.put(key, clazz); } public Map<String, Class<?>> getClasses() { return classes; } }