Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。

Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

Java的类加载器有三个,对应Java的三种类:

Bootstrap Loader // 负责加载系统类 (指的是内置类,像是String,对应于C#中的System类和C/C++标准库中的类)
|
- - ExtClassLoader //负责加载扩展类(就是继承类和实现类)
|
- - AppClassLoader //负责加载应用类(程序员自定义的类)

三个加载器各自完成自己的工作,但它们是如何协调工作呢?哪一个类该由哪个类加载器完成呢?为了解决这个问题,Java采用了委托模型机制。

委托模型机制的工作原理很简单:当类加载器需要加载类的时候,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。之所以是这种机制,还有一个安全上的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。

我们可以通过这样的代码来获取类加载器:

ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();

注意一个很重要的问题,就是Java在逻辑上并不存在BootstrapKLoader的实体!因为它是用C++编写的,所以打印其内容将会得到null。
前面是对类加载器的简单介绍,它的原理机制非常简单,就是下面几个步骤:


1.装载:查找和导入class文件;


2.连接:

(1)检查:检查载入的class文件数据的正确性;

(2)准备:为类的静态变量分配存储空间;

(3)解析:将符号引用转换成直接引用(这一步是可选的)


3.初始化:初始化静态变量,静态代码块。

这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。

 

最新文章

  1. 深入理解MySql子查询IN的执行和优化
  2. 自建Ceph存储与 AWS、阿里云、腾讯云的成本对比
  3. centos7.0安装后ifconfig无法使用
  4. 通过ksoap2-android来调用Web Service操作的实例
  5. signtool.exe not found
  6. php读取目录及子目录下所有文件名的方法
  7. FPGA内部信号避免高阻态
  8. PostgreSQL的备份与还原
  9. Zabbix监控IO
  10. mongodb 学习二
  11. redis的hash类型!!!!
  12. 从零开始学习PYTHON3讲义(六)for循环跟斐波那契数列
  13. Git 最佳实践:分支管理
  14. sed:-e 表达式 #1,字符 10:未终止的“s”命令
  15. [WC2018]州区划分
  16. vue中的组件
  17. demoshow - webdemo展示助手
  18. jade——创建第一个jade模板
  19. vue做的简单购物车
  20. 洛谷——P2071 座位安排 seat.cpp/c/pas

热门文章

  1. [机器学习之13]降维技术——主成分分析PCA
  2. ABBYY FineReader出现错误代码258
  3. Java 实现奇数阶幻方的构造
  4. 分巧克力【来源:CSDN线上编程挑战赛】——递归,费波那奇数列,迭代
  5. Zookeeper工作原理二
  6. R(八): R分词统计-老九门
  7. nova分析(2)—— nova-all
  8. Python基础教程【读书笔记】 - 2016/6/26
  9. rpm包安装时发现缺少其他依赖
  10. Softerra LDAP Browser 使用及配置 有图有真相