当前位置: 首页 > 知识库问答 >
问题:

第一次使用Classloader后保持打开状态

乐正浩宕
2023-03-14

我正在创建一个URLClassloader来加载一些JAR。每个jar从不同的classloader中正确加载,每个jar包含一个具有run()方法的类。现在这个run()的主体可以在其中创建一个匿名的内部类。但是,因为我在try-with-resources块中创建了我的URLClassloader,所以它会自动关闭,并且在运行时,当它试图加载匿名内部类时,它会抛出一个NoClassDefFoundError,因为classloader已经关闭。

下面是创建classloader的代码

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);

}

共有1个答案

胡曾笑
2023-03-14

类加载器的生命周期至少应该是用它加载的类的实例的生命周期。只要它们和它们的类没有资格进行垃圾收集,它们的类加载器也没有资格进行垃圾收集。如果他们需要加载额外的代码或资源,则需要打开类加载器。

因此,当您完成播放器时,您应该关闭类加载器。

 类似资料:
  • 问题内容: 我已经提交了类似的问题,但已将问题分解为最简单的形式,因此我将其再次发布: 问题是,如果我多次添加同一文件,SolrJ似乎会使文件句柄保持打开状态。 我使用以下方法向Solr提交文档: 而这种删除文件的方法: 但这似乎留有一些文件句柄: 以下代码段演示了该问题: 如果我两次添加相同的文档,SolrJ会以某种方式使这些句柄保持活动状态,并且添加的文档无法被任何其他进程修改。 我已经尝试调

  • 这是我的适配器类,我必须选中复选框,当再次打开应用程序时再次单击,我的数据被正确地保存在首选项中,并且也比较好,但问题是它没有在循环内显示选中的复选框,任何帮助都将被认可

  • 在打开和关闭其他ejb连接时保持和ejb连接打开是常见的还是可以接受的,还是应该在客户端完成连接并为后续任务打开新连接后立即关闭连接? 我目前正在开发一个使用EJB(JBoss AS7.1.1.final)的Swing应用程序。该应用程序打开一个ejb连接(即创建一个SynalContext实例),然后在应用程序保持运行的情况下将该SynalContext用于常见任务。有许多长时间运行的操作,其中

  • 我有一个这样的bat文件: 这会将IP信息打印到屏幕上,但在用户可以读取该信息之前,CMD会自动关闭。 我相信CMD假设脚本已经完成,所以它关闭了。 脚本完成后如何保持CMD打开?

  • 问题内容: 我可能是个白痴,但是如何在jQueryUI的手风琴中打开多个部分?演示一次只能打开一个……我正在寻找一个可折叠的菜单类型系统。 问题答案: 这原本是讨论中[的手风琴jQuery用户界面文档: 注意:如果要一次打开多个部分,请不要使用手风琴 手风琴不允许同时打开一个以上的内容面板,为此需要付出很多努力。如果您正在寻找一个可以打开多个内容面板的小部件,请不要使用它。通常它可以用几行jQue

  • 问题内容: 我有一个bukkit插件(minecraft),需要连接到数据库。 数据库连接应该一直保持打开状态,还是在需要时打开和关闭? 问题答案: 数据库连接仅在需要时才打开,并在完成所有必要的工作后关闭。代码示例: 在Java 7之前: try { con = … //retrieve the database connection //do your work… } catch (SQLEx