为什么.class不会引起类的初始化

duoyu5555 2015-05-13 01:25:03
如题,有个类是ClassA
为什么Class class_a=ClassA.class;
不会引起ClassA的初始化过程;
而改成Class class_a=Class.forName("package.ClassA");
则会引发初始化过程
...全文
286 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
DAVE-BLACK 2019-06-11
  • 打赏
  • 举报
回复
,class可以理解为告诉虚拟机这个类我要用。你赶紧看看有没有类模板供我使用
DAVE-BLACK 2019-06-11
  • 打赏
  • 举报
回复
.class是加载类模板。你可以用类模板.newinstance来构造对象。或者调用带参数的构造方法。详细的话参考反射
DAVE-BLACK 2019-06-11
  • 打赏
  • 举报
回复
.class是加载类模板。你可以用类模板.newinstance来构造对象。或者调用带参数的构造方法。详细的话参考反射
林蜗牛snail 2019-06-11
  • 打赏
  • 举报
回复
.class可能就相当于loadclass()? maybe,这块不是很懂
Leeycw96 2019-06-11
  • 打赏
  • 举报
回复
我个人的理解是:虽然ClassA.class看上去是调用了ClassA的类变量,应当是要初始化ClassA的,也就是要执行<clinit>,但是你可以直接去看.class文件关于这条语句的调用处,会发现该语句对应的指令不是invokestatic 所以这里是不会初始化ClassA,当然肯定是会加载ClassA的;至于Class.forName()为什么会初始化这个类,你可以去看下源码,最终底层会执行forName0()这个方法,而这个方法有个boolean参数initialize,默认为true,initialize就是初始化的意思,这么默认为true,所以是会初始化的,特别的一点是,Class类还提供了一个重载的forName()方法,可以指定boolean initialize,也就意味着你可以输入false,来让这个forName不执行初始化过程
S117 2015-05-13
  • 打赏
  • 举报
回复
这个要去看java虚拟机规范了
zapdos 2015-05-13
  • 打赏
  • 举报
回复
这个问题问的好,不过大概也就是实现问题而已 此外使用classloader来define一个class也是不会进行初始化的 所以我觉得forName其实也没必要初始化,可以留到使用时再初始化,不知道要初始化的原因是什么 等高手解答

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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