------------------JAVA程序员面试宝典----------------------------
基本概念:
Java程序本身并不是一个可执行文件,而是由许多独立的类文件组成的,每一个文件对应一个Java类。此外,这些类文件并非全部装入内存,而是根据程序需要逐渐载入ClassLoader。Java有四种类加载器(程序要用到某个类的时候,将该类加载进内存),四个类加载器分别是:Bootstrap ClassLoader、Extension ClassLoader、APPClassLoader、URLClassLoader。
- Bootstrap ClassLoader 启动类加载器,在JVM运行的时候加载Java核心的API,以满足Java程序最基本的要求。其中该加载器中可以包含用户自定义的ClassLoader,即Extension ClassLoader(用来加载Java的扩展API,/lib/ext中的类)和APPClassLoader(加载用户机器上CLASSPATH设置目录中的Class)
- Extension ClassLoader
- APPClassLoader
- URLClassLoader
ClassLoader加载流程:
当一个程序运行时,JVM启动,运行Bootstrap ClassLoader,该ClassLoader加载Java核心API,然后调用Extension ClassLoader加载扩展API,最后APPClassLoader加载CLASSPATH目录下定义的Class。
类加载的过程中使用到了父类委托模式,其原因是首先可以避免重复加载,如果父类已经加载了该类,没有必要再为子类再加载一次;其次是出于安全考虑
ClassLoader常用的方法:
- ClassLoader.loadClass(String name,boolean resolve);是ClassLoader的入口,name是JVM需要的类的名称,resolve告诉方法是否需要解析类。
- defineClass方法:接受由原始字节组成的数组,并把它转换成Class对象。
- findSystemClass方法:从本地文件系统装入文件。在本地文件系统中寻找类文件,如果存在,就用defineClass将原始字节转换成Class对象。
- resolveClass方法:带解析和不带解析的装入类
- findLoadClass方法:充当缓存器,如果已装载该Class,则不再装载
- findClass方法:loadClass默认实现调用这个新方法
- getSystemClassLoader方法:
- forName方法:与loadClass功能相似,当使用forName方法会将Class进行解释和初始化