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异常,自己重写后,就会走自己 重写的方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)