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");
浙公网安备 33010602011771号