问八:说说loadClass和forName的区别?
源代码解析:
ClassLoader.loadClass
首先是ClassLoader的loadClass(String class_name, boolean resolve)方法,传入了一个resolve的boolean类型
如果为true,则执行resolveClass方法,这个方法的作用是
即链接指定class,但是实际上在调用这个方法之前,就已经传入了它的默认值
因此ClassLoader.loadClass是不会链接class的
Class.forName
由源代码可以看出,当调用forName的时候,java会默认执行初始化工作,得到初始化完成后的class
回答:
Class.forName得到的class是已经初始化完成的,即执行了静态代码块的
ClassLoader.loadClass得到的class是还未进行链接处理的
示例代码:
public class Person {
static {
System.out.println("test 666");
}
}
public class Laod {
public static void main(String[] args) throws Exception {
ClassLoader aclassLoader = Laod.class.getClassLoader();
aclassLoader.loadClass("com.liu.socket.Person");
// Class<Laod> forName = (Class<Laod>) Class.forName("com.liu.socket.Person");
}
}
说一说它们这些特点的作用?
就拿com.mysql.jdbc.Driver来说,如果使用loadClass的话,就不能够创建它的对象,因为在其源代码中,有一段这样的静态代码:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
需要使用forName来进行初始化驱动
ClassLoader.loadClass可以使用在Spring IOC的延迟加载机制中,SpringIOC为了加快初始化速度,大量采用了懒加载(延迟加载)技术,等使用到的时候在初始化对象