package com.chamago.bison.loader; import java.net.URL; import java.net.URLClassLoader; import java.util.Hashtable; /** * * @author Gavin.peng * * 2013-10-27 下午04:04:50 × bison */ public abstract class AbstractClassLoader extends URLClassLoader { private Hashtable<String, Class<?>> classes = new Hashtable<String, Class<?>>(); private char classNameReplacementChar; public AbstractClassLoader() { super(new URL[0]); } public AbstractClassLoader(ClassLoader classLoader) { super(new URL[0], classLoader); } public Class<?> loadClass(String className) throws ClassNotFoundException { return loadClass(className, true); } public Class<?> loadClass(String className, boolean resolveIt) throws ClassNotFoundException { Class result = (Class)this.classes.get(className); if (result != null) return result; try { result = super.findSystemClass(className); } catch (Exception e) { result = null; } if (result != null) { return result; } byte[] classBytes = loadClassBytes(className); if (classBytes != null) { result = defineClass(className, classBytes, 0, classBytes.length); if (result == null) { throw new ClassFormatError(); } if (resolveIt) resolveClass(result); this.classes.put(className, result); return result; } throw new ClassNotFoundException(); } public void setClassNameReplacementChar(char replacement) { this.classNameReplacementChar = replacement; } protected abstract byte[] loadClassBytes(String paramString); protected String formatClassName(String className) { if (this.classNameReplacementChar == 0) { return className.replace('.', '/') + ".class"; } return className.replace('.', this.classNameReplacementChar) + ".class"; } }