手动加载类有两种方式,Class.forName()和ClassLoader.loadClass()两种,到底有什么区别呢?
通俗的讲,Class.forName()会初始化,即会执行被加载类的static块,ClassLoader.loadClass()则不会。由于在JDBC连接时,Driver类是有static块来初始化的,因此加载JDBC只能用Class.forName()。
一下说请区别:
JVM加载类时,需要经过三个步骤:装载(找到.class装入JVM)、连接(包括三步:验证[规范]、准备[默认初始值]、解析[地址])、初始化(赋值、构造函数)
Class.forName(name)默认调用Class.forName(name, initialize, loader)参数为Class.forName(name, true, CALLCLASS.class.getClassLoader()),true代表会进行连接,故会初始化该类
同理,ClassLoader.loadClass(name)调用ClassLoader.loadClass(name,resolve)参数为ClassLoader.loadClass(name, false),故其是不会解析的,故不会初始化。
具体,参考这位博主的博文。
还有这位博主的博文。
当然,你还需知道:static块什么时候执行