【发布时间】:2012-12-06 08:40:35
【问题描述】:
我正在创建一个 URLClassloader 来加载一些 jar。每个 jar 都从不同的类加载器正确加载,并且每个 jar 都包含一个带有方法 run() 的类。现在这个 run() 的主体可以在其中创建一个匿名内部类。但是,因为我在 try-with-resources 块中创建了我的 URLClassloader,所以它会自动关闭,并且在运行时当它尝试加载匿名内部类时,它会抛出 NoClassDefFoundError,因为类加载器已经关闭。
现在我的问题是,这些情况的正常做法是什么? 是否可以让类加载器保持打开状态,以便以后需要加载其他内容时,它可以吗?有没有办法重新打开关闭的类加载器?
如果我让类加载器保持打开状态,编译器会向我发出有关潜在资源泄漏的警告所以我觉得这就像你不应该让它们无限期打开的流。但是由于类加载器的性质,如果不是同一个加载匿名类的类加载器,就不能在外部类中使用
这是创建类加载器的代码
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);
}
【问题讨论】:
-
请注意,“关闭”类加载器与删除它不同。只要任何用它加载的类仍然在任何地方引用,加载器就仍然存在。 “关闭”它只是回收用于访问类路径的资源。如果您创建了很多类加载器,那么这些资源可以加起来(特别是进程打开文件句柄限制)。如果只有几个,那没什么大不了的。
标签: java classloader