Java类加载机制

BootstrapClassLoaderAppClassLoaderExtClassLoader,自定义类加载器

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 }

 

posted on 2017-10-13 16:13  龙甲第  阅读(175)  评论(0)    收藏  举报