ClassLoader和Class.forname的区别

类加载

类加载大致分为5个阶段:

  • 加载:java类运行时候会生成一个class字节码文件,加载的过程就是去我们的操作系统寻找这个class文件。
  • 链接:这个过程就是把class文件加载到java虚拟机,完成验证、准备、解析。
  • 初始化:在虚拟机中根据class文件进行初始化。
  • 使用:这个过程大家都明白。
  • 卸载:使用完了,java虚拟机进行清理。

对于class.forName和classloader来说针对的就是第一个过程,也就是加载过程。不过这俩虽然有一定的相似性,但是区别还是挺大的。

在java中Class.forName()和ClassLoader都可以对类进行加载。

class.forName

class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。注意这里的静态块指的是在类初始化时的一些数据,但是classloader却没有。

Class.forName()方法实际上也是调用的CLassLoader来实现的。 内部实际调用的方法是 Class.forName(className, true, classloader)

  • className:表示我们要加载的类名
  • true:指Class被加载后是不是必须被初始化。 不初始化就是不执行static的代码即静态代码,在这里默认为true,也就是默认实现类的初始化。
  • ClassLoader.getClassLoader(caller):表示类加载器,到这你会发现forNanme其实也是使用的ClassLoader类加载器加载的。
  • caller:指定类加载器。

classloader

ClassLoader是遵循双亲委派模型最终调用启动类加载器的类加载器,内部实际调用的方法是 ClassLoader.loadClass(className, false)。

先判断class是否已经被加载,如果被加载了那就重新加载,如果没有加载那就使用双亲委派原则加载。加载的时候并没有指定是否要进行初始化。

总结

class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。当然还可以指定是否执行静态块。

classLoader将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值