您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

类加载过程

时间:2022-06-28 14:44:15  来源:  作者:一只编程的菜狗

# 类加载过程

加载, 验证, 准备, 解析, 初始化下面依次说说

## 加载阶段

- 三步

- 找到class文件

- class文件转变的静态结构保存在方法区

- 生成class对象,保存在方法区

- 由ClassLoader实现类加载

- 启动类加载器 boostrapClassLoder

- %JAVAHOME%/lib

- 扩展类加载器 ExtantionClassLoder

- %JAVAHOME%/

- 系统/应用类加载器 ApplicationClassLoder

- classpath

- 继承系统类加载器的自定义加载器

- findclass()

- 双亲委派模式

- 从下往上找是否存在class对象

- 从上往下加载class对象

- 思考

- JDBC、Tomcat为什么要破坏双亲委派

- [JDBC、Tomcat为什么要破坏双亲委派模型? - 川流不息& - 博客园 (cnblogs.com)](
https://www.cnblogs.com/lyc88/articles/11431383.html)

- 自定义类加载器+加密+解密

- [自定义类加载器+加密+解密 实验 - 蓝色T-shirt - 博客园 (cnblogs.com)](
https://www.cnblogs.com/wllbelief-win/p/4508370.html)

## 验证

- 主要是对类元数据等信息结构的校验

## 准备

- 对类实例赋零值

- 注意final static是在编译器编译的时候就应经进入了常量池中,。

 

## 解析

- 解析阶段常量池中的方法的符号引用直接解析成直接引用

- 解析过程之字段解析(字段查找过程)

- 该字段的字段表的Constant_Class_info常量指向的类/接口C

- 在字段查找的时候, 先在本身的类中查找, 如果没有, 从接口中查找(从最先实现开始, 从下往上), 如果接口中没有, 或者没有实现接口, 从继承的父类中查找(从最先实现开始, 从下往上)

- <img src="https://s2.loli.NET/2022/06/23/RiL126c7BzOhDgC.png" alt="image-20220623164843459" style="zoom: 200%;" />

-

- 解析过程之方法解析(方法的查找)

-

- 分派

- 静态分派

- 非虚方法

- 在解析阶段中可以事先确定唯一的调用版本有静态方法、私有方法、实例构造器、父类方法4类

- final方法

- 一个类的方法重载

- 重载是根据方法的静态参数类型区分的而不是实例参数, 所以在选中方法的版本的时候也是根据方法的静态参数, 而非实例参数.

- demo

- ```java

/**

* 重载是根据方法的静态参数类型区分的而不是实例参数, 所以在选中方法的版本的时候也是根据方法的静态参数, 而非实例参数.

*/

public class StaticDispatch {

 

static abstract class Human {

}

 

static class Man extends Human {

 

}

 

static class Woman extends Human {

 

}

 

public void sayHello(Human guy) {

 

System.out.println("hello,guy!");

 

}

 

public void sayHello(Man guy) {

 

System.out.println("hello,gentleman!");

 

}

 

public void sayHello(Woman guy) {

 

System.out.println("hello,lady!");

 

}

 

public static void mAIn(String[] args) {

 

Human man = new Man();

 

Human woman = new Woman();

 

StaticDispatch sr = new StaticDispatch();

 

sr.sayHello(man);

 

sr.sayHello(woman);

//运行结果是:

//hello,guy

//hello,guy

 

}

 

}

```

-

- 如果实参类型没有直接对应匹配的方法,则实参会向上逐步类型提升,可见变长参数(数组或者...)的重载优先级是最低的, 直到找到方法

- ```java

import java.io.Serializable;

 

/**

* 如果实参类型没有直接对应匹配的方法,则实参会向上逐步类型提升,可见变长参数(数组或者...)的重载优先级是最低的, 直到找到方法

*/

 

public class OverloadTest {

 

// public static void sayHello(char arg) {

//

// System.out.println("hello char"); // |

// // |

// } // |

// |

public static void sayHello(int arg) {

// |

System.out.println("hello int"); // |

// ╲↓╱

}//代码我给排序了,类型自动提升过程 char,int,long,Character,Serializable,Object,char []

 

public static void sayHello(long arg) {

 

System.out.println("hello long");

 

}

 

public static void sayHello(Character arg) {

 

System.out.println("hello Character");

 

}

 

public static void sayHello(Serializable arg) {

 

System.out.println("hello Serializable");

 

}

 

public static void sayHello(Object arg) {

 

System.out.println("hello Object");

 

}

 

public static void sayHello(char... arg) {

 

System.out.println("hello char……");

 

}

 

public static void main(String[] args) {

 

sayHello('a');

// 运行结果为hello int

//代码我给排序了,不要误解为从上往下查找哈,当找不到的情况下,实参会自动类型提示,这个查了类型自动提升过程为 char,int,long,Character,Serializable,Object,char []

}

}

 

```

-

- 动态分派

- 虚方法

- 指向常量池中的方法的符号引用

## 初始化

- 类的加载、验证、准备、初始化是先后开始的, 多是在初始化之前,加载,验证,准备必然是已经开始了。

初始化阶段(Cinit<>)对static类变量赋初始值(非零值)

- 初始化的5个时机

- new / putstatic(调用类的static方法或static字段(非final static)的时候)

- 子类初始化的时候如果父类没有初始化, 那么父类会初始化

- main入口方法对应的类

- 反射

- ...忘记了

- 3种容易误以为会初始化的情况

- 子类.父类static 属性

- 这种情况只会初始化父类, 不会初始化子类

- 数组元素是类类型,那么这种类类型不会初始化, 除非实例化数组元素

- 访问类的final static属性。 那么这个类是不会初始化的, 因为final static在编译阶段就会直接保存到常量池中, 如果用到final static属性, 也只是宏替代。



Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
这类基金需警惕!热衷高换手,斩获收益的基金不足两成
高换手率或将加大亏损风险。2023年,市场热点行业、主题轮动加速,不少公募基金为了能跟上热点、提升收益,而频繁操作调仓换股。基金换手率,反映的是基金经理的股票交易频率,以及在...【详细内容】
2024-04-15  Search:   点击:(4)  评论:(0)  加入收藏
聊聊Rust里面的数据类型
嘿,朋友们!今天我们来聊聊Rust里面的数据类型。你知道吗?Rust的数据类型可是很重要的哦,它们帮助我们定义变量和函数可以处理什么样的数据。基本数据类型首先,让我们来看看Rust提...【详细内容】
2024-04-11  Search:   点击:(8)  评论:(0)  加入收藏
美联储降息或再延期 大类资产配置逻辑生变
4月10日,北京时间周三晚间美国3月份CPI公布为3.5%,较2月份3.2%有所上升,也高于预期值3.4%。美联储降息或再度延期,受此影响,美元强劲,美债大涨,而美股下跌,大宗商品分化,短期对全球市...【详细内容】
2024-04-11  Search:   点击:(8)  评论:(0)  加入收藏
走进光纤世界:揭秘光纤接口的四大类型
光纤技术作为现代通信的基石,已经广泛应用于各种数据传输场景中。它以高速率、长传输距离、抗干扰性强、低衰减以及带宽占用小等优点,成为了数据通信领域中的重要物理层连接方...【详细内容】
2024-04-10  Search:   点击:(7)  评论:(0)  加入收藏
AI程序员上岗 垂类大模型应用迎来井喷期
能自动写代码的“AI员工”、逐渐告别不够好用的智能客服,无需费时费力开发的工业AI控制器&hellip;&hellip;随着人工智能大模型能力开始深入多个行业,IT、工业生产、金融、服务...【详细内容】
2024-04-07  Search:   点击:(5)  评论:(0)  加入收藏
公募业绩全部出炉 四类基金减亏 这类产品赚近2400亿
随着基金年报的完整披露,2023年公募基金的整体业绩情况也浮出水面。数据显示,2023年,债券型基金作为传统避风港资产的角色,以其稳定的收益特性成为市场亮点,产品总利润超过了货币...【详细内容】
2024-04-07  Search:   点击:(12)  评论:(0)  加入收藏
北京法院公布一批信用卡诈骗案,这类型案件占比超七成,如何预防?
界面新闻记者 | 张灵霄近期,信用卡诈骗呈多发高发态势。3月29日,北京高院向社会通报五年来北京法院审理信用卡诈骗案件的有关情况。数据显示,2019年至2023年,北京法院审结一审信...【详细内容】
2024-04-02  Search:   点击:(14)  评论:(0)  加入收藏
哥伦比亚大学华人开发「人脸机器人」,照镜子自主模仿人类表情超逼真
【新智元导读】OpenAI 机器人理解力虽强,却无法进行非语言交流。最近,哥伦比亚大学华人团队打造了全新的机器人 Emo,不仅可以提前预测和模拟人类表情,还可以进行眼神交流。此前,...【详细内容】
2024-04-01  Search:   点击:(25)  评论:(0)  加入收藏
马斯克称AI造福人类概率远大于毁灭人类
在最近的一次讲话中,特斯拉和SpaceX首席执行官埃隆&middot;马斯克在超级人工智能对人类的潜在影响方面的立场似乎发生了令人惊讶的转变。周四,零重力公司(Zero Gravity)的CEO彼...【详细内容】
2024-03-29  Search:   点击:(22)  评论:(0)  加入收藏
ETF是什么?怎么分类?如何挑选?
ETF,全称Exchange Traded Fund,中文全称为“交易型开放式指数基金”,又称“交易所交易基金”,是一种在交易所上市交易的、基金份额可变的开放式基金。ETF属于开放式基金的一种特...【详细内容】
2024-03-25  Search:   点击:(21)  评论:(0)  加入收藏
▌简易百科推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(3)  评论:(0)  加入收藏
SELECT COUNT(*) 会造成全表扫描?回去等通知吧
前言SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?SELECT COUNT(*) FROM SomeTable网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小...【详细内容】
2024-04-11  dbaplus社群    Tags:SELECT   点击:(3)  评论:(0)  加入收藏
10年架构师感悟:从问题出发,而非技术
这些感悟并非来自于具体的技术实现,而是关于我在架构设计和实施过程中所体会到的一些软性经验和领悟。我希望通过这些分享,能够激发大家对于架构设计和技术实践的思考,帮助大家...【详细内容】
2024-04-11  dbaplus社群    Tags:架构师   点击:(2)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(5)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(9)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(16)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(14)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(9)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(14)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
站内最新
站内热门
站内头条