实现自定义类加载器的三步:

1.继承ClassLoader2.重写findClass()方法3.调用defineClass()方法

一个基本的自定义类加载器代码如下:

package cn.xpleaf.coding.c4;import java.io.*;/** * @author xpleaf * @date 2019/3/10 11:10 AM */public class CustomClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { try { byte[] result = getClassFromCustomPath(name); if (result == null) { throw new FileNotFoundException(name); } else { // defineClass方法将字节码转化为类 return defineClass(name, result, 0, result.length); } } catch (Exception e) { e.printStackTrace(); } throw new ClassNotFoundException(name); } private byte[] getClassFromCustomPath(String name) { // 从自定义路径中加载指定类,返回类的字节码文件 InputStream in = null; ByteArrayOutputStream out = null; String path = "/Users/yeyonghao/" + name + ".class"; try { in = new FileInputStream(path); out = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; int len = 0; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } return out.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { try { in.close(); out.close(); } catch (Exception e) { e.printStackTrace(); } } return null; } public static void main(String[] args) { CustomClassLoader customClassLoader = new CustomClassLoader(); try { Class<?> clazz = Class.forName("One", true, customClassLoader); Object obj = clazz.newInstance(); // cn.xpleaf.coding.c4.CustomClassLoader@610455d6 System.out.println(obj.getClass().getClassLoader()); } catch (Exception e) { e.printStackTrace(); } }}

执行结果如下:

cn.xpleaf.coding.c4.CustomClassLoader@610455d6