ClassforName和ClassLoaderloadClass的區(qū)別?
Class的裝載分了三個(gè)階段,loading,linking和initializing,分別定義在TheJavaLanguageSpecification的12.2,12.3和12.4。
Class.forName(className)
實(shí)際上是調(diào)用Class.forName(className,true,
this.getClass().getClassLoader())。注意第二個(gè)參數(shù),是指Class被loading后是不是必須被初始化。
ClassLoader.loadClass(className)實(shí)際上調(diào)用的是ClassLoader.loadClass(name,false),第二個(gè)參數(shù)指出Class是否被link。
區(qū)別就出來(lái)了。Class.forName(className)裝載的class已經(jīng)被初始化,而ClassLoader.loadClass(className)裝載的class還沒(méi)有被link。
一般情況下,這兩個(gè)方法效果一樣,都能裝載Class。但如果程序依賴于Class是否被初始化,就必須用Class.forName(name)了。
例
如,在JDBC編程中,常看到這樣的用法,Class.forName("com.mysql.jdbc.Driver"),如果換成了
getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。