Class Loading Linking initializing

 

类加载过程

  1.loading(加载到内存)

  2linking 

    ------1Verification(校验:这个class符不符合class文件标准CAFFEEBABE)

      2Preparation(把class 静态变量附默认值,不是赋初值 例如:int i=8,并不是直接赋值成8 而是先赋值为0 )

      3Resolution(将符号引用转换成内存地址,直接能访问到内存的内容)

  3initializing(静态内容的赋值,才调用静态代码块)

 

 

 

类加载器:jvm本身有一个类加载器的内容,这个类加载器分别来加载不同层级的class,jvm里面所有的class都是被类加载器加载到内存的,这个类加载器称为classLoader

 

 

ClassLoader 是一个抽象的类, 一定是它的子类将class加载到内存中,

一个class被加载到内存中变成两块内容,第一块内容是吧这块二进制内容加载到内存, 第二块内容生成了class对象, 这个class对象指向这个内容

 

不同的类加载器加载不同的class

bootstrap:负责加载jkd中最核心的jar文件 lib/rt.jar charset.jar等核心类, c++实现

extension:负责加载扩展jar包,jre/lib/ext/*.jar,或者由-Djava.ext.dirs指定

App(application) 加载classpath指定内容 java程序都是由他来加载

customClassLoader自定义类加载器

 

bootstrap(有一些核心的内库是由bootstrap来加载的 空值来加载的c++来实现的,getClassLoader 没有返回对应的class所以为值空)

 

 

 

 

 加入你自定义了class 就会先去customClassLoader里面去找,如果没有加载,并不是直接将定义的class直接加载到内存,他会去父加载器 appClassLoader 去寻找,如果有,返回,没有,委托上层extClassLoader,若到了

bootstrapClassLoader还是没有就会告诉下方ext,然后ext返回给app,app在给customClassLoader.没有加载过此类 可以加载,若加载失败,则抛出异常classNotFound

 

 

 一个从子到父的过程,然后再由父到子的过程

双亲委派就是从下往上,委派给双亲去加载,如果父类加载器加载过,那么就不会重复加载了。那么目的是什么呢?保证JVM加载类的安全性。保证JDK内部加载的类,不会被覆盖掉(比如,String类,不会被我们自定义的类覆盖掉)

 

 也不是类加载器的父类加载器

 

 appClassLoader

null

extClassLoader

null

 

自定义classLoader 先继承ClassLoader 然后重写它的findClass 方法,父类方法默认找不到就会抛出classnotfound异常,自己重写后,就会走自己 重写的方法

 

 

 

 

 



posted @   花心大萝卜li  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示