JVM虚拟机加载类到内存的ClassLoader.loadClass && Class.forName()的比较

    最近看了一些关于Class加载方式的资料,关于JVM类加载机制的,这也是面试经常被问到的题目。

    Java虚拟机加载类的可以通过Class.forName()和ClassLoader.loadClass()两种方式加载类到内存。不同的是主要有以下几点:

1.都有两个方法去加载类:

        1.1 前者Class的两个重载方法:
 	1. public static Class<?> forName(String className) throw ClassNotFoundException;
			       解析:参数className 是类的全限定名,如Object类在源文件中的全限定名为Java.lang.Object,即包名加类名
					通过Clas.forName("java.lang.Object"),加载类。
				   该方法默认对未被初始化的类进行初始化,从加载----链接----初始化;
	2. public static Class<?> forName(String className, boolean initialize, ClassLoader loader) throw ClassNotFoundException;
		解析:多了两个参数,一个是:是否进行初始化,第二个是用于加载类的指定加载器,为空说明采用引导类加载器(bootstrap);只有 initialize 参数为true 且以前未被初始化时,才初始化该类。
1.2 后者ClassLoader.loadClass的两个重载方法:
        1. protected synchronized Class<?> loadClass(String className, boolean resolve)throws ClassNotFoundException;
	解析:ClassName同样是类全限定名,resolve 表示是否进行连接操作,是(加载---连接---初始化)中的连接还没有初始化。
       2. public Class<?> loadClass(String className) throws ClassNotFoundException;
		解析:这里的是否连接默认为fasle;

2. 是否能够初始化类:

	ClassLoader.loadClass不会对类进行初始化,只能确定是否连接,而Class.forName会对类进行初始化,同时可以传递一个CLassLoader类加载器去加载该类。

总之,类从加载----连接(验证-准备-解析)--初始化的过程,是有先后顺序的,以上两种加载方式主要就是能否初始化类的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值