我正在创建一个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);
}
Run Code Online (Sandbox Code Playgroud)
类加载器的生命周期应该至少是与其加载的类的实例的生命周期。只要它们和它们的类不符合垃圾回收的条件,它们的类加载器也不符合垃圾回收的条件。如果他们需要加载额外的代码或资源,您需要打开类加载器。
因此,当您使用完播放器后,就应该关闭类加载器。
| 归档时间: |
|
| 查看次数: |
1718 次 |
| 最近记录: |