1.类加载过程

要点

  • 类加载过程
  • 类加载器

一、类加载过程

1.1 类的加载过程

类的加载 .class文件过程分为:加载---->连接---->初始化三个步骤。

  • 装载:查寻并加载.class文件的二进制数据读取到内存中,将器放在运行时数据区的方法区,然后在内存中,创建一个java.lang.Class对象(规范中并没有指定Class对象位于哪里,HotSpot虚拟机将其放在了方法区中),用来封装类在方法区的数据结构。(JDK8是元数据区)
    加载方式有多种:本地加载;通过网络加载.class文件;zip或jar包加载.class文件等
  • 链接:把类的二进制数据合并到JRE中;
    a.校验:检查载入Class文件数据的正确性;
    b.准备:给类的静态变量分配存储空间,并初始化默认值;
    c.解析:将符号引用转成直接引用;
  • 初始化:对类的静态变量赋予正确的初始值,静态代码块执行初始化操作
1.2 Java类初始化

Java类的使用分为主动使用和被动使用
Java类或接口是在 首次主动使用的时候初始化的。

  • 主动使用:
      1)创建类的实例(new)
      2)访问类或接口的静态变量(getstatic)或对静态变量赋值(putstatic),只是该静态变量的直接类才会初始化
      3)调用类的静态方法(invokestatic)
      4)反射
      5)初始化一个类的子类,会要求其所有父类必须先初始化
          - 类初始化时,不会初始化其接口
          - 子接口初始化时,不会初始化父接口
      6)java虚拟机启动的时候标记为启动类的类(Junit Test 、main方法)

其他情况都是被动使用, 不会导致类的初始化。

     1)引用类的static final变量(字面量,编译期可知其值)不会引起初始化
     2)引用父类的static变量是不会引起子类的初始化
     3)实例化类的数组,是不会导致类初始化

二、类加载器

2.1 类加载器
    1)Bootstrap ClassLoader : 将存放于<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath 
        参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中(加载jar包或class 
        文件)。启动类加载器无法被Java程序直接引用(用c语言编写是最顶层的加载器,在java 
        代码中如果尝试获取,例如:String.class.getClassLoader(),会返回null)
    2)Extension ClassLoader : 将<JAVA_HOME>\lib\ext目录下的,或者被java.ext.dirs系统变 
      量所指定的路径中的所有类库加载;开发者可以直接使用扩展类加载器;只能加载扩展目 
      录下的jar包,不能加载class文件
    3)Application ClassLoader : 负责加载用户类路径(ClassPath)上所指定的类库,开发者可直 
        接使用;(利用ClassLoader.getSystemClassLoader()可以获得);可以在家jar包或class文 
        件
    4)最后还有一个自定义类的加载器
2.2 双亲委派机制
image.png

双亲委派机制得工作过程:

    1)类加载器收到类加载的请求;
    2)把这个请求委托给父加载器去完成,一直向上委托,直到启动类加载器;
    3)启动器加载器检查能不能加载(使用findClass()方法),能就加载(结束);否则,抛 
         出异常,通知子加载器进行加载

同一个类的标准:类的全路径名必须一致;类的加载器也必须是同一个

好处:java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都会委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。如果用户自己写了一个名为java.lang.Object的类,并放在程序的Classpath中,该类不会被加载。

class.forName(className),反射是对className的主动使用,会导致类的初始化;而java.lang.ClassLoader.loadClass(className)并不是对类对主动使用,所以不会导致className类对初始化

2.3如何破坏双亲委派机制
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容