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

f45056231p 2018-09-02 06:01:45
为了方便描述,这样说吧:类的生命周期为:加载>链接>初始化>使用>卸载(是这样吧?),我问题的加载就是指的这个第一步的加载
问题1:编译器会触发类的加载吗?所有需要静态加载的类,都会加载?
问题2:假设编译器会触发类的加载,那这就我们常说的静态加载吗?那往后在运行期,已静态加载过的类,就不再触发加载而直接去执行后面的吗?
问题3.那用反射实现的,在运行期才加载,这才是动态加载?但为什么很多人又说,所有的类,都是按需动态加载的呢?
...全文
712 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
打豆豆。 2018-09-05
  • 打赏
  • 举报
回复
类的加载机制,总的来讲分为预加载和调用加载。预加载是jvm在预判断你要使用调用某个类的时候提前准备加载,调用加载就是调用类或者调用类中方法会引起类的加载。如果细分类加载器的执行流程的话,没那个必要,我们只需要研究一下类加载的最后一阶段,解析使用这个类的时候进行初始化(包括访问类中的方法,初始化子类,创建类的实例,或者运行该类,或者反射的方式创建class字节码对象
monica888888 2018-09-04
  • 打赏
  • 举报
回复
问题1:编译器会触发类的加载吗?所有需要静态加载的类,都会加载?
编译器:就是把我们写.java文件---转换成.class 字节码,也就是二进制。
加载:就是要把这些二进制全部放到内存里面,
连接:我认为把一类中所涉及的其它类全部入内存。
初始化:就是把类里面的数据赋值(一般都有默认值),然后得到一个内存地址,这样大家都可以用了
类名.class
Class.forName 类名.class:全部是类加载,一连串执行完,得到一个Class的对象,也叫类对象。
Class.forName会报错,类名.class不报错。
静态代码块:会在类加载完之后初始化,复制,相当一个全局值,以后再也不调用了,这个类所有的对象可以用这个全局数据


maradona1984 2018-09-04
  • 打赏
  • 举报
回复
引用 5 楼 f45056231p 的回复:
[quote=引用 3 楼 maradona1984 的回复:]
编译期不会类加载
你的代码运行中,调用了某个类,才会类加载,或者代码中有Class.forName这种也会类加载
静态块里的代码在类加载时执行,静态变量会被初始化

静态代码块不是在类初始化时执行吗?比如类名.class这样的方式,会有类加载,不会触发类初始化,也就执行静态代码块吧[/quote]
自己试试不就知道了?用过jdbc加载驱动包吧,驱动类里都有个静态块
maradona1984 2018-09-03
  • 打赏
  • 举报
回复
编译期不会类加载
你的代码运行中,调用了某个类,才会类加载,或者代码中有Class.forName这种也会类加载
静态块里的代码在类加载时执行,静态变量会被初始化
verejava 2018-09-03
  • 打赏
  • 举报
回复
JVM 虚拟机 之 main 启动过程

http://www.verejava.com/?id=1742647253499
f45056231p 2018-09-03
  • 打赏
  • 举报
回复
引用 2 楼 verejava 的回复:
JVM 虚拟机 之 main 启动过程

http://www.verejava.com/?id=1742647253499

打不开
f45056231p 2018-09-03
  • 打赏
  • 举报
回复
引用 3 楼 maradona1984 的回复:
编译期不会类加载
你的代码运行中,调用了某个类,才会类加载,或者代码中有Class.forName这种也会类加载
静态块里的代码在类加载时执行,静态变量会被初始化

静态代码块不是在类初始化时执行吗?比如类名.class这样的方式,会有类加载,不会触发类初始化,也就执行静态代码块吧
f45056231p 2018-09-03
  • 打赏
  • 举报
回复
引用 3 楼 maradona1984 的回复:
编译期不会类加载
你的代码运行中,调用了某个类,才会类加载,或者代码中有Class.forName这种也会类加载
静态块里的代码在类加载时执行,静态变量会被初始化

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

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧