URLClassLoader を閉じる

URLClassLoader を閉じる方法

URLClassLoader close() メソッドは、特定のコードベースから (特に JAR ファイルから) ロードされたクラスとリソースの更新された実装をサポートする方法に関する問題を効果的に取り除きます。原則として、アプリケーションがローダーオブジェクトへの参照をすべてクリアすると、ガベージコレクタとファイナライズメカニズムは、最終的にすべてのリソース (JarFile オブジェクトなど) が解放されて閉じられるようにします。

そのあとアプリケーションは JAR ファイルを置き換えて、同じ場所からロードするための新しい URLClassLoader インスタンスを作成しますが、今回はクラス/リソースの新しい実装を使用します。ただし、ファイナライズとガベージコレクションがいつ行われるかを正確に予測できないため、予測可能で適切なタイミングでこれを行うことができる必要があるアプリケーションでは問題が発生します。開いているファイルを削除したり置き換えたりできないため、これは Windows での問題です。

Java SE 7 では、URLClassLoader close() メソッドは、ローダーから新しいクラスをロードできないようにローダーを完全に無効にします。また、ローダーが開いた JAR ファイルをすべて閉じます。これによって、アプリケーションは、これらのファイルを削除するか置き換えて、必要に応じて、新しい実装を使用して新しいローダーを作成できます。

close() メソッドは、よく使用される「Closeable」パターンに従い、URLClassLoader は、URLClassLoader.close() を定義する Closeable インタフェースを実装するようになりました。次のサンプルコードは、メソッドの使用方法を示しています。

       //
       // create a class loader loading from "foo.jar"
       //
       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();


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.