Class.forName与ClassLoader区别

Class 用来描述一个类型,当一个类型被装载(虚拟机读取二进制的class文件)的时候,会创建一个与该类型对应的Class对象到内存堆中。(这个时候该类型甚至没有被分配内存,设置默认值,更别说初始化了)。
Class.forName有2个重载的方法:

    public static Class<?> forName(String name, boolean initialize,  
                   ClassLoader loader)  
           throws ClassNotFoundException  
      
      
    public static Class<?> forName(String className)   
                   throws ClassNotFoundException  

 第一个方法:
name:类的全限定名,如:com.aaa.bbb.ccc
initialize:如果为true,则会在返回Class对象之前,对该类型做连接,校验,初始化操作。(如:执行static块中的代码)
loader:用自定义的类加载器来请求这个类型;当然,你也可以传入null,用bootstrap加载器。
第二个方法:
name和上面相同。默认initialize为true,
而loader是这么获取的

ClassLoader.getCallerClassLoader()

 其实就是获取当前类的classLoader,也就是装载执行forName操作的类的classLoader

类ClassLoader包括2个重载的loadClass类

protected synchronized Class<?> loadClass(String name, boolean resolve)  
    throws ClassNotFoundException  
  
public Class<?> loadClass(String name) throws ClassNotFoundException

 两个方法都需要传name,既类的全限定名作为参数。
resolve:表示是否需要连接该类型。
注意:是连接(这里面包括校验class文件,准备分配内存,类型常量池的替换),并不会初始化该类型。

 

都说清楚了,也很容易区分出不同点:
1.Class.forName返回的Class对象可以决定是否初始化。而ClassLoader.loadClass返回的类型绝对不会初始化,最多只会做连接操作。
2.Class.forName可以决定由哪个classLoader来请求这个类型。而ClassLoader.loadClass是用当前的classLoader去请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值