最近研究了一下java的類加載器
先看一下實例化一個類的幾種方法:
1、new2、Class.newInstance3、clone()4、序列化
再看一下加載一個類的幾種方法:
1、A a =new A();(單獨聲明一個類A a,不會促使類加載器加載我們要的類,只有實例化new的時候類加載器才會為我們加載類)2、Class.forName(pkg.A); or Class.forName(pkg.A,true|fale,ClassLoader)3、classLoader.loadClass(pkg.A);
java的類加載可以分為預(yù)先載入和依需求載入,用java -verbose可以看到類的加載順序
關(guān)于類的初始化(執(zhí)行static程序段):
1、A a = new A();在類加載的時候即進(jìn)行初始化2、Class.forName(A);在類加載的時候即進(jìn)行初始化3、Class.forName(A,false,classLoader);在newInstance的時候進(jìn)行初始化4、classLoader.loadClass(A);在newInstance的時候進(jìn)行初始化
再看一下類加載器的分層結(jié)構(gòu)
1、最上層是用c++實現(xiàn)的Bootstrap Loader,sun.boot.class.path2、ExtClassloader,搜尋位置為java.ext.dirs(System.geProperty("java.ext.dirs"))3、AppClassLoader(也稱System Loader),搜尋位置為CLASSPATH
java的類加載器采用(委派模式),即類加載器器先委托父類去加載該類