Java URLClassLoader 和 ClassLoader类加载器

开始:看名字都带有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

原文地址:https://www.cnblogs.com/rogge7/p/7766522.html