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异常,自己重写后,就会走自己 重写的方法



浙公网安备 33010602011771号