ClassLoader简介
生活随笔
收集整理的這篇文章主要介紹了
ClassLoader简介
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ClassLoader
? 所有的類加載器(除了根類加載器)都必須繼承java.lang.ClassLoader。它是一個抽象類,主要的方法如下:
loadClass
? 在ClassLoader的源碼中,有一個方法loadClass(String name,boolean resolve),這里就是雙親委托模式的代碼實現。從源碼中我們可以觀察到它的執行順序。需要注意的是,只有父類加載器加載不到類時,會調用findClass方法進行類的查找,所以,在定義自己的類加載器時,不要覆蓋掉該方法,而應該覆蓋掉findClass方法。
//ClassLoader類的loadClass源碼 protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) {// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}findClass
? 在自定義類加載器時,一般我們需要覆蓋這個方法,且ClassLoader中給出了一個默認的錯誤實現。
protected Class<?> findClass(String name) throws ClassNotFoundException {throw new ClassNotFoundException(name); }defineClass
? 該方法的簽名如下。用來將byte字節解析成虛擬機能夠識別的Class對象。defineClass()方法通常與findClass()方法一起使用。在自定義類加載器時,會直接覆蓋ClassLoader的findClass()方法獲取要加載類的字節碼,然后調用defineClass()方法生成Class對象。
protected final Class<?> defineClass(String name,byte[] b,int off,int len)throws ClassFormatErrorresolveClass
? 連接指定的類。類加載器可以使用此方法來連接類。
?
總結
以上是生活随笔為你收集整理的ClassLoader简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 类加载的双亲委派机制
- 下一篇: URLClassLoader的使用