`
QING____
  • 浏览: 2234130 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

URLClassLoader有关close方法(JDK 7)

    博客分类:
  • JAVA
 
阅读更多

    JDK 7中对URLClassLoader中新增了close方法,主要用于解决本地jar更新加载的异常问题。

 

    URLClassLoader.close()方法有效地消除了如何支持从特定代码库(http),特别是从JAR文件(本地)加载的类和资源的更新实现的问题。

 

    原则上,一旦应用程序清除对loader对象(仅仅是loader对象,而非加载的class对象)的所有引用,垃圾收集器和终结机制将最终确保释放和关闭所有资源(例如,本地JarFile对象打开文件)。然后,应用程序可以替换本地JAR文件,并创建一个新的URLClassLoader实例以从同一位置加载,使用类/资源的新实现。

 

    但是,由于无法准确预测何时进行终结和垃圾收集,因此需要能够以可预测和及时的方式执行此操作的应用程序会出现问题,这是Windows上的问题,因为无法删除或替换打开的文件(直到GC执行,jarFile有关资源释放)。---JDK 7之前

 

    在Java SE 7中,URLClassLoader.close()方法有效地使加载器失效,因此不能从中加载新类,它还会关闭加载程序打开的所有JAR文件。这允许应用程序删除或替换这些文件,并在必要时创建新的加载器并加载新的类实现或资源。

 

URL url = new URL("file:/code/test.jar");

URLClassLoader loader = URLClassLoader.newInstance(new URL[] {url});
Class cl = Class.forName ("com.test.Test", true, loader);
Runnable test = (Runnable) cl.newInstance();
test.run();
//关闭,释放资源,此后将不能使用loader类加载新类,但是已经加载的class不受影响。
loader.close ();

//此时,loader对象已经不再使用,我们重新创建loader对象。
//如果老的loader不close,将无法重新打开。除非GC
loader = URLClassLoader.newInstance(new URL[] {url});;
cl = Class.forName ("com.test.Test", true, loader);
test = (Runnable) cl.newInstance();
test.run();

 

 参考文档:关闭URLClassLoader

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics