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%\jre\lib)
2).扩展内加载器(ExtClassLoader) .. 主要加载扩展目录下的jar包, %JAVA_HOME%\lib\ext
3). 应用类加载器(AppClassLoader) ...主要加载我们应用程序中的类
4. Class加载时调用类加载器的顺序
应用类加载器 ----委托加载---》 扩展类加载器--委托加载---》 根类加载器
当一个类要被加载时,有一个启动类加载器和实际类加载器的概念,这个概念请看如下分析
如上面的Test.class要进行加载时,它将会启动应用类加载器进行加载Test类,但是这个应用类加载器不会真正去加载他,而是会调用看是否有父加载器,结果有,是扩展类加载器,扩展类加载器也不会直接去加载,它看自己是否有父加载器没,结果它还是有的,是根类加载器。
所以这个时候根类加载器就去加载这个类,可在%JAVA_HOME%\jre\lib下,它找不到com.Test这个类,所以他告诉他的子类加载器,我找不到,你去加载吧,子类扩展类加载器去%JAVA_HOME%\lib\ext去找,也找不着,它告诉它的子类加载器 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]