9

I am creating a URLClassloader to load some jars. Each jar gets loaded correctly from a different classloader and each jar contains a class with a method run(). Now the body of this run() can create an anonymous inner class in it. However, because i created my URLClassloader in a try-with-resources block it gets autoclosed and at run time when it tries to load the anonymous inner class it throws a NoClassDefFoundError because the classloader is already closed.

Now my question is, what is the normal practice for these situations? is it ok to leave the classloader open so that when later it needs to load something else, it can? is there a way to reopen a closed classloader?
If I leave the classloader open, the compiler gives me warnings about potential resource leaks so I have a feeling this is like streams where you are not supposed to leave them open indefinitely. However because of the nature of classloaders, if it's not the same classloader that loads the anonymous class, it cannot be used in the outer class

here is the code where the classloader is created

public Player(File codePath) throws PlayerException {

   try (URLClassLoader loader = new URLClassLoader(new URL[] { codePath.toURI().toURL() })) {

   //load class from Jar where run() method creates anonymous class that comes in the jar too


   } catch (ClassCastException | IOException | ClassNotFoundException | InstantiationException
| IllegalAccessException | IllegalArgumentException | InvocationTargetException
| SecurityException exc) {
throw new PlayerException("Error loading player's code", exc);

}
4

2 に答える 2

3

クラス・ローダーの存続時間は、少なくともロードされたクラスのインスタンスの存続時間である必要があります。それらとそのクラスがガベージ コレクションの対象でない限り、それらのクラス ローダーも同様です。また、追加のコードやリソースをロードする必要がある場合は、クラス ローダーを開く必要があります。

そのため、プレーヤーを使い終わったら、クラス ローダーを閉じる必要があります。

于 2012-12-19T08:50:45.927 に答える
0

プレイヤーごとに新しいクラスローダーを作成するのではなく、Factory パターン (または類似のもの) を使用できます。

URLClassLoader loader = PlayerClassLoaderFactory.getInstance().getClassLoader(codePath.toURI())

ファクトリはクラスローダーへの参照を維持します(したがって、クラスは孤立しません)。次に、必要に応じてファクトリを「シャットダウン」してクラスローダーを閉じることができます。

于 2012-12-19T06:36:27.320 に答える