我正在创建一个 URLClassloader 来加载一些罐子。每个 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);
}