Java类加载机制
BootstrapClassLoader、AppClassLoader和ExtClassLoader,自定义类加载器
BootstrapClassLoader没有继承classLoader,由JVM自定义实现
自定义类加载器,须实现classLoader的findclass方法
1 /** 2 * Load class from network 3 */ 4 public class NetworkClassLoader extends ClassLoader { 5 @Override 6 protected Class<?> findClass(String name) throws ClassNotFoundException { 7 byte[] classData = downloadClassData(name); // 从远程下载 8 if (classData == null) { 9 super.findClass(name); // 未找到,抛异常 10 } else { 11 return defineClass(name, classData, 0, classData.length); // convert class byte data to Class<?> object 12 } 13 return null; 14 } 15 private byte[] downloadClassData(String name) { 16 // 从 localhost 下载 .class 文件 17 String path = "http://localhost" + File.separatorChar + "java" + File.separatorChar + name.replace('.', File.separatorChar) + ".class"; 18 try { 19 URL url = new URL(path); 20 InputStream ins = url.openStream(); 21 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 22 int bufferSize = 4096; 23 byte[] buffer = new byte[bufferSize]; 24 int bytesNumRead = 0; 25 while ((bytesNumRead = ins.read(buffer)) != -1) { 26 baos.write(buffer, 0, bytesNumRead); // 把下载的二进制数据存入 ByteArrayOutputStream 27 } 28 return baos.toByteArray(); 29 } catch (Exception e) { 30 e.printStackTrace(); 31 } 32 return null; 33 } 34 public String getName() { 35 System.out.printf("Real NetworkClassLoader\n"); 36 return "networkClassLoader"; 37 } 38 }
浙公网安备 33010602011771号