Class.forName && ClassLoader.loadClass

Class的装载分了三个阶段,loading,linking和initializing。
 
Class.forName(className)
实际上是调用Class.forName(className, true, this.getClass().getClassLoader())。
注意第二个参数,是指Class被loading后是不是必须被初始化。
 
ClassLoader.loadClass(className)
实际上调用的是ClassLoader.loadClass(name, false)。
第二个参数指出Class是否被link。
 
Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。
一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
 
用法:

Class.forName("com.Clazz", true, getClass().getClassLoader());

ClassLoader cl = Thread.currentThread().getContextClassLoader();
cl.loadClass("com.Clazz");

 

posted on 2018-08-29 15:08  xiaowater  阅读(70)  评论(0)    收藏  举报

导航