当初看了几本书后因为觉得反射,多态,动态链接有共同的地方,所以对底层有了好奇。
终于能动手写这篇博客了,前前后后的逻辑感觉能走通了。
反射是在运行期动态的获取某个类的成员和方法。
反射和类加载器的关系,即是我们在反射调用某个类时,这个类会被类加载器加载一次,第一个问题,如何去加载这个类,第二个问题,谁来加载这个类。
加载的这个类时通过加载这个类的class文件完成的,要找到这个class文件,我们需要这个类的名字,在java虚拟机规范中有提到这个名字是class的二进制名称。二进制名称也叫全限定名,其命名逻辑和电脑本地上某个文件的路径类似,比如类加载器的二进制名称就为java/lang/ClassLoader。class文件的二进制名称被放在class文件常量池的Constant_Utf8_info结构中。如果没有找到这个二进制名称的class文件,则会报出ClassNotFound。
在之前的博客里提到过,出于安全原因,不同类加载器加载的类是不允许相互可见的,又相互引用关系的class文件会被同一类加载器加载,使它们可相互访问,也就是一个类加载器对应一个命名空间;由此,‘我’在经过反射调用对象N时,加载N的class文件的类加载器,即为加载