详见:http://blog.sina.com.cn/s/blog_6cbfd2170100ljmp.html

1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中

2.java中的类大致分为三种:

1.系统类

2.扩展类

3.由程序员自定义的类

3.类装载方式,有两种

1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。

2.显式装载, 通过class.forname()等方法,显式加载需要的类

隐式加载与显式加载的区别?两者本质是一样?

4.类加载的动态性体现

一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现

5.java类装载器

Java中的类装载器实质上也是类,功能是把类载入jvm中,值得注意的是jvm的类装载器并不是一个,而是三个,层次结构如下:

Bootstrap Loader  - 负责加载系统类

|

- - ExtClassLoader  - 负责加载扩展类

|

- - AppClassLoader  - 负责加载应用类

为什么要有三个类加载器,一方面是分工,各自负责各自的区块,另一方面为了实现委托模型,下面会谈到该模型

6. 类加载器之间是如何协调工作的

前面说了,java中有三个类加载器,问题就来了,碰到一个类需要加载时,它们之间是如何协调工作的,即java是如何区分一个类该由哪个类加载器来完成呢。

在这里java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”,注意喔,这句话具有递归性

下面举一个例子来说明,为了更好的理解,先弄清楚几行代码:

Public class Test{

Public static void main(String[] arg){

ClassLoader c  = Test.class.getClassLoader();  //获取Test类的类加载器

System.out.println(c);

ClassLoader c1 = c.getParent();  //获取c这个类加载器的父类加载器

System.out.println(c1);

ClassLoader c2 = c1.getParent();//获取c1这个类加载器的父类加载器

System.out.println(c2);

}

}

运行结果:

。。。AppClassLoader。。。

。。。ExtClassLoader。。。

Null

注: 。。。表示省略了内容

可以看出Test是由AppClassLoader加载器加载的,AppClassLoader的Parent 加载器是ExtClassLoader 但是ExtClassLoader的Parent为 null 是怎么回事呵,朋友们留意的话,前面有提到Bootstrap Loader是用C++语言写的,依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,所以在java程序代码里试图打印出其内容时,我们就会看到输出为null。

类装载器ClassLoader(一个抽象类)描述一下JVM加载class文件的原理机制

类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件,在java中类装载器把一个类装入JVM,经过以下步骤:

1、装载:查找和导入Class文件

2、链接:其中解析步骤是可以选择的

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

(b)准备:给类的静态变量分配存储空间

(c)解析:将符号引用转成直接引用

3、初始化:对静态变量,静态代码块执行初始化工作

类装载工作由ClassLoder和其子类负责。JVM在运行时会产生三个ClassLoader:根装载器,ExtClassLoader(扩展类装载器)和AppClassLoader,其中根装载器不是ClassLoader的子类,由C++编写,因此在java中看不到他,负责装载JRE的核心类库,如JRE目录下的rt.jar,charsets.jar等。ExtClassLoader是ClassLoder的子类,负责装载JRE扩展目录ext下的jar类包;AppClassLoader负责装载classpath路径下的类包,这三个类装载器存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。默认情况下使用AppClassLoader装载应用程序的类

Java装载类使用“全盘负责委托机制”。“全盘负责”是指当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入;“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,但有了全盘负责制,java.lang.String永远是由根装载器来装载,避免以上情况发生

除了JVM默认的三个ClassLoder以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。类文件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。数组,枚举及基本数据类型,甚至void都拥有对应的Class对象。Class类没有public的构造方法,Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的

转载于:https://www.cnblogs.com/lukelook/p/10851068.html

Java加载Class文件的原理机制相关推荐

  1. java虚拟机及加载class文件的原理机制

    2019独角兽企业重金招聘Python工程师标准>>> (点击获取更多资料的下载) java 虚拟机 ‎2007‎年‎4‎月‎23‎日,‏‎14:18:00 | chenweicai ...

  2. 常见Java面试题之JVM加载class文件的原理机制

    JVM加载class文件的原理机制 JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的 ...

  3. java文件读入原理_描述一下JVM加载class文件的原理机制

    1.JVM 简介 JVM 是我们Javaer 的最基本功底了,刚开始学Java 的时候,一般都是从"Hello World "开始的,然后会写个复杂点class ,然后再找一些开源 ...

  4. Java提高篇——JVM加载class文件的原理机制

    阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...

  5. J2EE JVM加载class文件的原理机制

    JVM加载class文件的原理机制 1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的 ...

  6. JVM加载class文件的原理机制

    阅读目录 1.JVM 简介 2.JVM 的组成部分 3.JVM加载class文件的原理机制 在面试java工程师的时候,这道题经常被问到,故需特别注意. 回到顶部 1.JVM 简介 JVM 是我们Ja ...

  7. 描述一下JVM加载class文件的原理机制

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

  8. 面试常备题---JVM加载class文件的原理机制

    在面试java工程师的时候,这道题经常被问到,故需特别注意. Java中的所有类,都需要由类加载器装载到JVM中才能运行.类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中.在写 ...

  9. Java - 描述一下JVM加载class文件的原理机制

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net JVM中类的装载是由类加载器(ClassLoader ...

  10. Android(Java)加载SO文件

    原文地址点击打开链接 一.前言 Android中有时候为了效率以及平台开发库的支持,难免会用到NDK开发,那么都会产生一个so文件,通过native方法进行调用,开发和调用步骤很简单,这里就不多说了, ...

最新文章

  1. eclipse中运行c++控制台没输出
  2. 日本精密减速器,到底牛在哪?
  3. 7 年“键盘手”没在意!某程序员手疼查出骨肿瘤,已让骨头成了“豆腐渣”
  4. [kuangbin] M - Find a way(简单广搜)
  5. python的学习笔记(0)之循环的使用1
  6. 蛙蛙推荐:几种典型的生产环境调试场景
  7. servlet post 返回值是一个对象_Servlet第二天
  8. 开源ETL软件在智能化集成系统中的应用
  9. Python线程指南 ---转自 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
  10. python UDP-数据报协议
  11. Jmeter之JSON Path Extractor的使用(JSON-handle下载安装和使用)
  12. 频频被关注的 AI,怎样才能用着舒心?
  13. 完美谢幕,这就是科比!
  14. Rust Async: Pin概念解析
  15. LOJ2361「NOIP2016」组合数问题
  16. 税盘怎么看服务器是否在维护,税盘服务器地址怎么查
  17. Matlab 绘制 BP 神经网络图
  18. lpx寒假作业案例9
  19. JVM性能调优(一)(JVM参数详解、内存分析等)
  20. k8s 1.18.20 kubevirt v0.47.1 创建 windows10 虚拟机

热门文章

  1. 基于SSM的车辆管理系统
  2. Mysql远程授权报语法错误
  3. 数学建模第七章 数理统计
  4. MultipartFile接口实现文件上传
  5. Linux chapter 8
  6. 情人节到了,Postman 都脱单了,那你咧?
  7. 2.6.PHP7.1 狐教程-【PHP运算符】
  8. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_16-页面静态化-模板管理-模板制作...
  9. 阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制
  10. 记录.net使用ueditor富文本编辑器