社区
Java
帖子详情
为什么.class不会引起类的初始化
duoyu5555
2015-05-13 01:25:03
如题,有个类是ClassA
为什么Class class_a=ClassA.class;
不会引起ClassA的初始化过程;
而改成Class class_a=Class.forName("package.ClassA");
则会引发初始化过程
...全文
369
7
打赏
收藏
为什么.class不会引起类的初始化
如题,有个类是ClassA 为什么Class class_a=ClassA.class; 不会引起ClassA的初始化过程; 而改成Class class_a=Class.forName("package.ClassA"); 则会引发初始化过程
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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其实也没必要初始化,可以留到使用时再初始化,不知道要初始化的原因是什么 等高手解答
深入理解
Class
.forName() 与
Class
Loader 的区别:为什么一个会
初始化
类
,一个
不会
?
摘要:Java中
Class
.forName()和
Class
Loader.load
Class
()都能加载
类
,但本质不同。
Class
.forName()会触发
类
的
初始化
(执行静态代码块),而
Class
Loader.load
Class
()仅加载
类
不
初始化
。JDBC驱动必须使用
Class
.forName()来注册驱动,因其依赖静态代码块。实际开发中,需要立即
初始化
类
时用
Class
.forName(),延迟加载则用
Class
Loader.load
Class
()。两者的选择取决于是否需要立即执行
类
的静态
初始化
逻辑。
什么时候会发生
类
的
初始化
?
package cn.sxy.demo02; //什么时候
类
会发生
初始化
public
class
Test05 { static { System.out.println("Main
类
初始化
"); } public static void main(String[] args) { //1.
类
的主动引用(一定会发生
类
的
初始化
) //当虚拟机启动,先
初始化
main方法所在的
类
/** 打印结果 *.
java基础 之 从
Class
.forName()跟.
class
的区别看
类
的
初始化
代码如下: public
class
Test { public static void main(String[] args) throws Exception { System.out.println("调用.
class
");
Class
<Main> main
Class
= Main.
class
; System.out.pri...
Java获取一个
类
的
Class
对象的四种方式
1.通过
Class
Loader对象的load
Class
()方法 比如以下方式:
Class
Loader.getSystem
Class
Loader().load
Class
("com.my.test.Hello") 去看一下load
Class
的源码: public
Class
<?> load
Class
(String name) throws
Class
NotFoundExceptio...
java中
类
不会
被
初始化
的几种情况
大家都知道
类
初始化
是在
类
的连接后执行的,
类
的声明周期如下图所示:
初始化
是执行
类
构造器clinit()方法的过程。 clinit()方法是由编译器自动收集
类
中的所有
类
变量(被static修饰的变量)和静态代码块(static{}块)中的语句合并产生的。 所以验证
类
有没有被
初始化
就可以看它的静态块有没有执行。 下面的代码是打印已加载
类
的方法,实例中会用到,查看
类
是否已经被加载 public
class
Print
Class
Info { public static void printLoadedCl
Java
51,407
社区成员
86,118
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章