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, 2020, Oracle and/or its affiliates. All rights reserved.