開始:看名字都帶有ClassLoader,叫做類加載器,事實上是可以理解為動態的加載類,不過,也不是只能加載類,也可以加載其他形式的文件,比如說.properties屬性文件。
區別:其實在兩個類加載器有一點小區別,就在於能夠加載的類存放的位置,從JDK源碼上來看其實是URLClassLoader繼承了ClassLoader,也就是說URLClassLoader把ClassLoader擴展了一下,所以可以理解成URLClassLoader功能要多點。
ClassLoader只能加載classpath下面的類,而URLClassLoader可以加載任意路徑下的類。他們的繼承關系如下:
public class URLClassLoader extends SecureClassLoader {}
public class SecureClassLoader extends ClassLoader {}
URLClassLoader是在java.net包下的一個類。一般動態加載類都是直接用Class.forName()這個方法,但這個方法只能創建程序中已經引用的類,並且只能用包名的方法進行索引,比如Java.lang.String,不能對一個.class文件或者一個不在程序引用里的.jar包中的類進行創建。
URLClassLoader提供了這個功能,它讓我們可以通過以下幾種方式進行加載:
* 文件: (從文件系統目錄加載)
* jar包: (從Jar包進行加載)
* Http: (從遠程的Http服務進行加載)
當class文件或者resources資源文件更新后,我們需要重新加載這些類或者Jar。從理論上來說,當應用清理了對所加載的對象的引用,那么垃圾收集器就會將這些對象給收集掉,然后我們再重新加載新的JAR文件,並創建一個新的URLClassLoader來加載。可是這里有一個問題,就是我們不知道垃圾收集器什么時候將那些未被引用的對象給收集掉,特別是在Windows中,因為在Windows中打開的文件是不可以被刪除或被替換的。
在Java7的Build 48版中,URLClassLoader提供了close()這個方法,可以將打開的資源全部釋放掉,這個給開發者節省了大量的時間來精力來處理這方面的問題。
URL url = new URL("file:foo.jar"); URLClassLoader loader = new URLClassLoader (new URL[] {url}); Class cl = Class.forName ("Foo", true, loader); Runnable foo = (Runnable) cl.newInstance(); foo.run(); loader.close (); // foo.jar gets updated somehow loader = new URLClassLoader (new URL[] {url}); cl = Class.forName ("Foo", true, loader); foo = (Runnable) cl.newInstance(); // run the new implementation of Foo foo.run();
=====網友
ClassLoader 與 URLClassLoader 的用法 - CSDN博客
http://blog.csdn.net/a454832841/article/details/38661635
ClassLoader工作機制 - 溫布利往事 - 博客園--貌似很不錯圖文並茂
http://www.cnblogs.com/xujian2014/p/5551153.html
