1.继承ClassLoader父类自定义类加载器
2.自定义类加载器,默认partner为AppClassLoader
初始化自定义类加载器时,调用父类ClassLoader的构造方法
protected ClassLoader() {this(checkCreateClassLoader(), getSystemClassLoader());}public static ClassLoader getSystemClassLoader() {initSystemClassLoader();if (scl == null) {return null;}SecurityManager sm = System.getSecurityManager();if (sm != null) {checkClassLoaderPermission(scl, Reflection.getCallerClass());}return scl;}private static synchronized void initSystemClassLoader() {if (!sclSet) {if (scl != null)throw new IllegalStateException("recursive invocation");sun.misc.Launcher l = sun.misc.Launcher.getLauncher();//获取jvm启动器实例if (l != null) {Throwable oops = null;scl = l.getClassLoader();//获取AppClassLoader//删除其他逻辑代码}}}
public class MyClassLoader extends ClassLoader {private String classPath;public MyClassLoader(String classPath) {this.classPath = classPath;}private byte[] loadByte(String name) throws Exception {name = name.replaceAll("\\.", "/");FileInputStream fis = new FileInputStream(classPath + "/" + name + ".class");int available = fis.available();byte[] data = new byte[available];fis.read(data);fis.close();return data;}protected Class<?> findClass(String name) throws ClassNotFoundException {try {byte[] data = loadByte(name);return defineClass(name, data, 0, data.length);} catch (Exception e) {throw new ClassNotFoundException();}}}
