Class.forName VS ClassLoader.loadClass
1、Class.forName 特点
Class.forName有两个重载
- 有类名、是否初始化、classLoader
- 只有类名
只有类名的,实际上表现同有1,是否初始化字段默认为true,classLoader是调用者的classLoader
是否初始化:置为false时,不会进行初始化操作,也就不会执行静态代码块
classLoader:指定classLoader,不一定非要是调用者的classLoader
Class.forName(className)方法,内部实际调用的方法是 Class.forName(className,true,classloader);
第2个boolean参数表示类是否需要初始化, Class.forName(className)默认是需要初始化。一旦初始化,就会触发目标对象的 static块代码执行,static参数也也会被再次初始化。
2、classLoader.loadCass特点
classLoadr.loadClass只完成加载,不进行初始化操作
只有在真正需要使用这个类的时候,才会进行初始化操作
ClassLoader.loadClass(className)方法,内部实际调用的方法是 ClassLoader.loadClass(className,false);
第2个 boolean参数,表示目标对象是否进行链接,false表示不进行链接,不进行链接意味着不进行包括初始化等一些列步骤,那么静态块和静态对象就不会得到执行