ClassLoader 详解 /类加载原理

1.  classLoader是什么?

ClassLoader是类的加载器,用于加载class对象到JVM中的,分为2种,启动类加载器和实际类加载器.

2. ClassLoader的作用

.java文件通过javac.exe编译成.class文件,然后通过classLoader加载到JVM内存中. 加载到JVM内存的就是Class对象,存储着.class字节码内容,每一个class对象都有getClassLoader()方法, 得到是谁把我从.class文件加载到内存中变成Class对象的。

3.  ClassLoader层次结构

  1).根类加载器(null)   ..由本地代码(c/c++)实现,加载(%JAVA_HOME%jrelib)

  2).扩展内加载器(ExtClassLoader)  .. 主要加载扩展目录下的jar包, %JAVA_HOME%libext

3). 应用类加载器(AppClassLoader)   ...主要加载我们应用程序中的类

4.   Class加载时调用类加载器的顺序

  应用类加载器  ----委托加载---》  扩展类加载器--委托加载---》 根类加载器  

   当一个类要被加载时,有一个启动类加载器和实际类加载器的概念,这个概念请看如下分析

    如上面的Test.class要进行加载时,它将会启动应用类加载器进行加载Test类,但是这个应用类加载器不会真正去加载他,而是会调用看是否有父加载器,结果有,是扩展类加载器,扩展类加载器也不会直接去加载,它看自己是否有父加载器没,结果它还是有的,是根类加载器。

  所以这个时候根类加载器就去加载这个类,可在%JAVA_HOME%jrelib下,它找不到com.Test这个类,所以他告诉他的子类加载器,我找不到,你去加载吧,子类扩展类加载器去%JAVA_HOME%libext去找,也找不着,它告诉它的子类加载器 AppClassLoader,我找不到这个类,你去加载吧,结果AppClassLoader找到了,就加到内存中,并生成Class对象。

这个时间时候启动类加载器(应用类加载器)和实际类加载器(应用类加载器)是同一个。

ClassLoader利用其特性可以防止java核心类被覆盖。编写java.lang.Long类,定义一个main方法,执行该main方法时,会出现找不到main方法的提示。

没有main方法是因为执行的根本不是我们自己写的类,执行的是java核心中的那个Long类,当然没有main方法了。 这样就防止我们应用中写的类覆盖掉java核心类。

 特性:

类加载器基于三个机制:委托、可见性和单一性

委托机制是指将加载一个类的请求交给父类加载器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它。

可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。

单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。

参考:

1.Java类加载器(http://www.cnblogs.com/wang-meng/p/5574071.html )

2.ClassLoader 详解及用途[http://blog.chinaunix.net/uid-21227800-id-65885.html]

原文地址:https://www.cnblogs.com/alisonGavin/p/6881853.html