反射机制是java中经常用到的,特别是在J2EE框架中,基本上都会有用到它。
要弄清楚反射机制,首先要清除lang包中的两个类ClassLoader和Class。
ClassLoader:
我们知道java程序编译成class文件之后,就回杯load到code segment区,但是这个load的过程并不是一次性完成的。
首先,class文件不会一次性加载,而是会在需要的时候杯加载,也就是所谓的动态加载(static语句块加载后只执行一次)。在JDK中,会有很多种的classloader,如Bootstrap
ClassLoader,Externsion ClassLoader,App ClassLoader等等,这些加载器(除了Bootstrap ClassLoader)都继承自ClassLoader,作用各不相同。
Bootstrap ClassLoader:这个是加载的基础类,主要就是加载的核心class(核心库):rt.jar,resources.jar...
Extension ClassLoader:顾名思义,这个就是用来加载ext路径下的class(拓展库)
App ClassLoader:负责加载当前java application的Classpath的所有类Class Loader是一个非常注重等级尊严的家族,有很“森严”的等级制度。
先说下这3个类加载器的关系,Bootstrap ClassLoader是Extension ClassLoader的parenrt,Extension ClassLoader是App ClassLoader的parent,注意这里不是继承关系,这里的三个指的是对象之间的关系。可以理解为App ClassLoader对象中有一个引用指向Extension ClassLoader,而Extension ClassLoader对象有一个引用指向Bootstrap ClassLoader,而Bootstrap ClassLoader是没有parent的。(ClassLoader有getParent()方法可以测试)。
加载过程(加载机制):程序编译生成class文件,会首先被APP ClassLoader加载,他在加载之前会首先根据parent引用判断parent ClassLoade是否已经加载此类,如果加载了,他就不加载,如果没有加载,并且parent ClassLoade还有parent引用,会看他的上一级ClassLoader是否加载,如此下去,如果 都没有加载这个Class,App Classloder才会加载此类。这里也就是所谓的“森严”。举个例子,我们 声明一个String对象,他应该是被App ClassLoader加载,但是他会”咨询“他的parent ClassLoader有没有加载,因为在Bootstrap Classloder已经加载,所以不会被其他加载器加载。这种机制会使得封装很严密,很好的保护java程序。
Class