5.7 loadClass和forName的区别
类的加载方式
隐式加载:new,直接获取类实例,可以使用带参的构造方法,初始化类
显示加载:loadClass,forName等,只能获取到类对象,需要调用newInstance方法来创建类实例,但是newInstance方法不能够传入参数,如果要使用带参的构造方法,需要使用反射机制。
LoadClass和forName的区别
相同:在运行时,都能知道任意一个类的属性和方法,对于任意一个对象,都能调用他的任意方法和属性。
不同:Class.forName得到的class是已经初始化完成的;Classloader.loadClass得到的class是还没有链接的。
源码:
验证:
初始化时会执行静态代码块:
没有执行static代码块
Static代码块被执行了
使用:
比如获取数据库驱动时,要使用forName,因为驱动类有一块静态代码块
Spring IOC为了提高加载类的效率,大量使用了延迟加载技术,使用ClassLoader就不需要执行类中的初始化代码的步骤,这样做可以加快类的加载速度,将加载类的工作放到实际使用该类的时候去做。