由于Java是一种动态解释型语言,所以class只有被加载到JVM中后才能运行。运行一个程序,JVM将编译生成的.class文件按照一定的需求和规则加载到内存中,并组织成为一个完整的Java应用程序。而加载的过程是类加载器完成的,类加载器本身也是一个类,实质就是把类文件从硬盘读取到内存中。类的加载方式:
1.隐式加载:new操作创建对象时会隐式调用类加载器将类加载到JVM中,
2.显示加载:通过直接调用Class.forName(“className”)来将所需的类加载到JVM当中。
在Java语言中,类的加载是动态的,不会一次将所有的类加载后再运行,而是保证程序运行的基础类完全加载到JVM当中,其他类在需要时加载。Java内置三种类加载器:
- Bootstrap:启动类加载器,使用C++实现,是虚拟机自身的一部分,无法被Java程序直接引用
- ExtClassLoader:扩展类加载器,开发者可直接使用的标准扩展类加载器,xml文件解析类、界面框架类
- AppClassLoader:应用程序加载类,负责用户类路径上指定的类库。
- 自定义类加载器
JVM加载类时默认使用双亲委派模型(JDK1.2引入):双亲委派模型就是当一个类加载器接收到类加载请求时,先将加载任务委托给父类去处理,每一层的类加载器都是这样,因此所有加载请求都会传送到顶层的BootStrap中,只有当上层加载器反馈无法完成这个类加载请求时(在自己的搜索范围中没有找到此类),下层加载器才会常识自己去加载。
双亲委派模型对Java程序的稳定运行有很好的保证,让Java的类随着他的类加载器一起具备了一种带有优先级的层次关系;q比如Object类,它存放在rt.jar中,无论哪个类加载器加载这个类,都会将他交给最顶层BootStrap加载器尝试加载,所以Object类在程序的任何类加载器环境中都是同一个类。