最近很困惑,类的加载问题

[复制链接]
查看11 | 回复9 | 2021-1-27 06:48:26 | 显示全部楼层 |阅读模式
为了方便描述,这样说吧:类的生命周期为:加载>链接>初始化>使用>卸载(是这样吧?),我问题的加载就是指的这个第一步的加载
问题1:编译器会触发类的加载吗?所有需要静态加载的类,都会加载?
问题2:假设编译器会触发类的加载,那这就我们常说的静态加载吗?那往后在运行期,已静态加载过的类,就不再触发加载而直接去执行后面的吗?
问题3.那用反射实现的,在运行期才加载,这才是动态加载?但为什么很多人又说,所有的类,都是按需动态加载的呢?

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
问题1错了一个字,是编译期
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
JVM虚拟机之main启动过程
http://www.verejava.com/?id=1742647253499
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
编译期不会类加载
你的代码运行中,调用了某个类,才会类加载,或者代码中有Class.forName这种也会类加载
静态块里的代码在类加载时执行,静态变量会被初始化
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
引用3楼maradona1984的回复:编译期不会类加载
你的代码运行中,调用了某个类,才会类加载,或者代码中有Class.forName这种也会类加载
静态块里的代码在类加载时执行,静态变量会被初始化

看了篇文章,有一点解惑.有一些基础类,就算还没调用到,在jvm启动初期就会预加载,如Object类,然后我们自己写的类是会像您说的那样按需加载,但具体是饿汉式的加载,这个类一引用到(只是单纯引用到,比如只是声明这样一个类型的变量为null),就立马加载,还是懒汉式的,等到这个类要初始化的时候再加载,根据不同的jvm具体实现,有不同的加载方式?是有这样的说法吗?
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
引用3楼maradona1984的回复:编译期不会类加载
你的代码运行中,调用了某个类,才会类加载,或者代码中有Class.forName这种也会类加载
静态块里的代码在类加载时执行,静态变量会被初始化

静态代码块不是在类初始化时执行吗?比如类名.class这样的方式,会有类加载,不会触发类初始化,也就执行静态代码块吧
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
引用2楼verejava的回复:JVM虚拟机之main启动过程
http://www.verejava.com/?id=1742647253499

打不开
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
引用5楼f45056231p的回复:Quote: 引用3楼maradona1984的回复:
编译期不会类加载
你的代码运行中,调用了某个类,才会类加载,或者代码中有Class.forName这种也会类加载
静态块里的代码在类加载时执行,静态变量会被初始化

静态代码块不是在类初始化时执行吗?比如类名.class这样的方式,会有类加载,不会触发类初始化,也就执行静态代码块吧

自己试试不就知道了?用过jdbc加载驱动包吧,驱动类里都有个静态块
回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
问题1:编译器会触发类的加载吗?所有需要静态加载的类,都会加载?
编译器:就是把我们写.java文件---转换成.class字节码,也就是二进制。
加载:就是要把这些二进制全部放到内存里面,
连接:我认为把一类中所涉及的其它类全部入内存。
初始化:就是把类里面的数据赋值(一般都有默认值),然后得到一个内存地址,这样大家都可以用了
类名.class
Class.forName类名.class:全部是类加载,一连串执行完,得到一个Class的对象,也叫类对象。
Class.forName会报错,类名.class不报错。
静态代码块:会在类加载完之后初始化,复制,相当一个全局值,以后再也不调用了,这个类所有的对象可以用这个全局数据


回复

使用道具 举报

千问 | 2021-1-27 06:48:26 | 显示全部楼层
类的加载机制,总的来讲分为预加载和调用加载。预加载是jvm在预判断你要使用调用某个类的时候提前准备加载,调用加载就是调用类或者调用类中方法会引起类的加载。如果细分类加载器的执行流程的话,没那个必要,我们只需要研究一下类加载的最后一阶段,解析使用这个类的时候进行初始化(包括访问类中的方法,初始化子类,创建类的实例,或者运行该类,或者反射的方式创建class字节码对象
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行