谈谈ClassLoader

classloader的作用到本质再到种类

ClassLoader在Java中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二进制数据流。它是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过将Class文件里的二进制数据流装在进系统,然后交给Java虚拟机进行连接、初始化等操作。

  • BootStrapClassLoader:作用主要是加载核心库Java.*,通常这些核心类的Class被签名不能被替换掉。它是由JVM内核实现的,在HotSpot VM及目前主要的java虚拟机中是用C++实现的。有了它加载最核心的内容才会有后面的ClassLoader存在。

  • ExtClassLoader:Java编写,加载扩展库Javax.*。这个ClassLoader是用户可见的,是用来加载位于jre/lib/ext目录下的jar包。用户也可以将自定义的jar包放到这个目录下,通过这个ClassLoader去加载。

  • AppClassLoader:Java编写,加载程序所在目录。也是用户可见的ClassLoader。它是用来加载class path下的内容。

  • 自定义ClassLoader:Java编写,定制化加载。

    demo:

 1 public class MyClassLoader extends ClassLoader {
 2     private String path;
 3     private String classLoaderName;
 4 
 5     public MyClassLoader(String path, String classLoaderName) {
 6         this.path = path;
 7         this.classLoaderName = classLoaderName;
 8     }
 9 
10     //用于寻找类文件
11     @Override
12     public Class findClass(String name) {
13         byte[] b = loadClassData(name);
14         return defineClass(name, b, 0, b.length);
15     }
16 
17     //用于加载类文件
18     private byte[] loadClassData(String name) {
19         name = path + name + ".class";
20         InputStream in = null;
21         ByteArrayOutputStream out = null;
22         try {
23             in = new FileInputStream(new File(name));
24             out = new ByteArrayOutputStream();
25             int i = 0;
26             while ((i = in.read()) != -1) {
27                 out.write(i);
28             }
29         } catch (Exception e) {
30             e.printStackTrace();
31         } finally {
32             try {
33                 out.close();
34                 in.close();
35             } catch (Exception e) {
36                 e.printStackTrace();
37             }
38         }
39         return out.toByteArray();
40     }
41 }
1 public class ClassLoaderChecker {
2     public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
3         MyClassLoader m = new MyClassLoader("路径", "classloader名");
4         Class c = m.loadClass("类名");
5         c.newInstance();
6     }
7 }

 

posted @ 2019-03-08 13:14  bce1100  阅读(293)  评论(0编辑  收藏  举报