11

ユーザーが提供するスクリプトの実行中にコードを一時的に表示するために、アプリケーションで多くのクラスローダーを作成する必要がある場合があります。私はURLClassLoaderこれに を使用していますが、かなりうまく機能します。

スクリプトが終了したら、クラス ローダーを「アンロード」または「クローズ」してリソースを解放します。

クラスローダーへの参照を に設定するだけで十分nullですか? 余分なクラスが JAR ファイルにあるため、最終的にファイル ハンドルが不足するのではないかと特に考えています。

PS: Java 5 以降で動作する必要があります。ええ、私は知っています...

4

6 に答える 6

5

Java7 を使用できず、それが close() メソッドである場合は、次のようにリフレクションを使用して、クラスローダーの開いているすべての JAR アーカイブを閉じます。

public void close() {
try {
   Class clazz = java.net.URLClassLoader.class;
   java.lang.reflect.Field ucp = clazz.getDeclaredField("ucp");
   ucp.setAccessible(true);
   Object sun_misc_URLClassPath = ucp.get(this);
   java.lang.reflect.Field loaders = 
      sun_misc_URLClassPath.getClass().getDeclaredField("loaders");
   loaders.setAccessible(true);
   Object java_util_Collection = loaders.get(sun_misc_URLClassPath);
   for (Object sun_misc_URLClassPath_JarLoader :
        ((java.util.Collection) java_util_Collection).toArray()) {
      try {
         java.lang.reflect.Field loader = 
            sun_misc_URLClassPath_JarLoader.getClass().getDeclaredField("jar");
         loader.setAccessible(true);
         Object java_util_jar_JarFile = 
            loader.get(sun_misc_URLClassPath_JarLoader);
         ((java.util.jar.JarFile) java_util_jar_JarFile).close();
      } catch (Throwable t) {
         // if we got this far, this is probably not a JAR loader so skip it
      }
   }
} catch (Throwable t) {
   // probably not a SUN VM
}
return;
}
于 2015-06-29T11:38:43.873 に答える
4

クラスローダーがロードしたすべてのクラスに参照がなくなり、クラスローダー自体へのすべての参照が消去されると、クラスローダーとそれがロードしたクラスはグループとしてガベージコレクションされます。

これは、参照されていないクラスがアンロードされる原因となるJVM属性が設定されているかどうかに依存することに注意してください。ほとんどの環境ではデフォルトで設定されていますが、一部の埋め込みケースでは設定されていない場合があります。

[クラスへの参照を削除することは重要な問題であることに注意してください。名前でそれを参照する他のクラスは、もちろん削除を防ぎます。したがって、クラスはClassLoader.findClassなどを使用してロードする必要があります。]

于 2011-09-20T16:00:50.773 に答える
3

そのクラスローダからロードされたクラス (およびオブジェクト) がなくなった場合、およびそのクラスローダへの参照を保持していない場合は、ガベージ コレクタによって自動的に処理されます。

于 2011-09-20T15:53:35.013 に答える
1

URL クラス ローダーまたはその親クラスのいずれにも close() メソッドがないため、うまくいきません。

GCはこれを処理すべきではありませんか?

于 2011-09-20T15:50:31.767 に答える
0

URLClassLoaderを拡張し、Java7sに基づいてcloseメソッドを作成しました。iPad 2でIRCボットを開発したかったので、必要なことを行いました。これで、プラグインシステムはJava6および7で安定しました。

于 2012-07-04T20:04:59.640 に答える