代码之家  ›  专栏  ›  技术社区  ›  Mike

Java,运行时类重载

  •  2
  • Mike  · 技术社区  · 14 年前

    我正在寻找一种在运行时将类重新加载到Java中的方法。其动机是使调试更有效。应用程序是一种典型的客户机/服务器设计,可以同步处理请求。为每个请求实例化一个“handler”对象。这是我唯一打算动态替换的类。因为每个请求都处理一个新实例,所以重新加载这个类不会有任何副作用。简而言之,我不希望每次对此模块进行更改时都重新启动整个应用程序。

    在我的设计中,Java进程意识到在请求之间的类路径中已经更新了.class文件。当这种情况发生时,卸载“handler”类并加载新的类。

    我知道我可以使用classloader接口在一个新类中加载。我似乎很难找到合适的“卸货”方式。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Michael Borgwardt    14 年前

    如果没有对类的剩余引用,则类将像任何其他对象一样被卸载和垃圾收集。这意味着类不能有可访问的实例(由特定的类加载器实例加载),并且类加载器实例本身也必须有资格进行垃圾收集。

    因此,基本上,您所要做的就是创建一个新的类加载器实例来加载该类的新版本,并确保不存在对旧版本实例的引用。

        2
  •  1
  •   Arjan Tijms UML GURU    11 年前

    我相信您实际上需要有一个类加载器的层次结构,为了重新加载,您实际上去掉了低级的类加载器(通过普通的gc方法),因此也去掉了它加载的所有类。据我所知,JavaEE应用服务器使用该技术来重新加载应用程序,当加载在一个类加载器中的框架代码想要使用加载到其他地方的类时,会有各种有趣的结果。

        3
  •  0
  •   samarjit samanta    9 年前

    在2015中,Java的类重载也是一个缺失的特性。

    • 使用 奥斯吉 创建类重新加载应用程序。
    • 使用JRebel进行测试。还有一些人做同样的事情。
    • 使用application server并将要重新加载到单独web应用程序中的部分外部化。然后继续部署/取消部署。由于挂起旧的类加载器实例,最终会出现一些perm gen空间溢出类错误。
    • 使用脚本运行程序执行部分可更改代码。Java脚本API对脚本语言“Java”的支持。

    我写了一系列关于重新加载类的文章。但所有这些方法都不利于生产。

    在Java中这种类重载是混乱的,不值得尝试。但我非常希望这是Java中的规范。